算法 - 制作最高的塔

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

输出示例:

阿拉伯数字

类似于我很久以前的任务。该算法的想法是:

  • 将项目(乐高积木(放入循环列表(封闭的单链表(;
  • 使函数
    • 循环中
      1. 从列表中获取下一个元素(删除它(
      2. 递归地校准自身
      3. 插入以前删除的元素
      4. 前进到下一个元素

当列表为空时,您有一个可能的乐高序列。算法仅使用每个列表元素构建所有可能的海域一次。

工作代码:

#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( "" );
}

在您的情况下,可以进一步优化(例如,当当前元素不堆叠时中断递归(。