算法 - 制作最高的塔
Algorithm - Make Highest Tower
本文关键字:算法 更新时间:2023-10-16
我有一个无法解决的问题。我想过很多解决方案,但似乎没有人有效。
这就是我的问题:
你得到 n1, n2, ....nk 乐高,每个乐高都有偶数张面孔。
每个乐高只有在以下情况下才能堆叠另一个:
-
上部乐高与下方的乐高具有相同的面;
-
上部乐高必须具有小于或等于其下方乐高面部数的面数。
除此之外,每个面都有一个相反的面,该面通过输入插入到第一个面之后;
示例:乐高 1 - 脸 1、脸 2、脸 3、脸 4(脸 1 和脸 2 是对立的,例如脸 3 和脸 4(。
问题要求用这些乐高制作最高的塔,每个乐高只使用一次。塔必须只有一个方向,因此它只能从左到右或从下到上。
非常感谢,对不起我的英语不好:/
输入示例:
乐高1 - f1, f2, f3, f4, f5, f6
乐高2- f33, f47, f98, f123
乐高3 - f4,f127
输出示例:
阿拉伯数字
类似于我很久以前的任务。该算法的想法是:
- 将项目(乐高积木(放入循环列表(封闭的单链表(;
- 使函数
- 循环中
- 从列表中获取下一个元素(删除它(
- 递归地校准自身
- 插入以前删除的元素
- 前进到下一个元素
- 循环中
当列表为空时,您有一个可能的乐高序列。算法仅使用每个列表元素构建所有可能的海域一次。
工作代码:
#include <stdio.h>
#define MAX 4
struct CList{
int d;
struct CList *next;
};
void search(struct CList *pstart);
void result(struct CList *v[MAX], const int nv);
int main(){
static struct CList lst[MAX];
struct CList *p = lst;
int i;
for( i = 0; i < MAX - 1; i++){
lst[i].d = i;
lst[i].next = lst + i + 1;
}
lst[MAX-1].d = MAX - 1;
lst[MAX-1].next = lst;
search( p );
return 0;
}
void search(struct CList *pstart){
struct CList *p, *pp;
static struct CList *v[MAX];
static int nv = 0;
if( pstart->next == pstart ){
v[nv++] = pstart;
result( v, nv );
nv--;
return;
}
nv++;
p = pstart;
do{
pp = p;
p = p->next;
v[nv-1] = p;
pp->next = p->next;
search( pp );
p->next = pp->next;
pp->next = p;
} while( p != pstart );
nv--;
}
void result(struct CList *v[MAX], const int nv){
int i;
for( i = 0; i < nv; i++ ){
printf(" %d ", v[i]->d);
}
puts( "" );
}
在您的情况下,可以进一步优化(例如,当当前元素不堆叠时中断递归(。
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- 如何在 Mac 上使用 c++17 并行标准库算法?