汉诺塔问题,解析

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而>上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。[2]

汉诺塔问题的分析
*************************************************************************8
A,B,C三个柱子
如果是1个盘子

那么直接A–>C

2个盘子
A–>B(第一步)把A柱子下边最大的留下别的放到B
A–>C(第二步)把最大的放到C柱子

B–>C(第三步)把B柱子上的移到C柱子上

3个盘子
A–>C,A–>B,C–>B (第一步)把A柱子下边最大的留下别的放到B
A–>C(第二步)把最大的放到C柱子
B–>A,B–>C,A–>C(第三步)把B柱子上的再移到C柱子上
@ @ @ @ @
会发现无论多少个盘子 我们都可以分成如上的三个步骤把它移好
@ @ @ @ @
然后我们看3个盘子的
第一步:A–>C,A–>B,C–>B
第三步:B–>A,B–>C,A–>C
第一步我们也可以分成3步
A–>C(1)把A柱子除了最大的那个移到C
A–>B(2)把A柱子最大的移到B
C–>B(3)把C上边的再移动到B
第三步我们也可以分成3步
B–>A(1)把B柱子除了最大的那个移到A
B–>C(2)把B柱子最大的移到C
A–>C(3)把A上边的再移动到C


可以发现它基本上都是三步三步的来的
然后设有N个盘子
第一次(N-1个盘子,A–>B借助C)
第二次(A上边最大的移动到C)

第三次(N-1个盘子,B–>C借助A)

其中第一次又可以分成三步。。
而分成的三步中的第一步和第三步还可以分成三步。。

这就是一种规律。。。

#include
int b=0;
void ps()
{   for(int i=0;i<50;i++
)   printf("*");
printf("\n");}
void bt()
{
for(int i=0;i<20;i++)   printf("*");
printf("汉诺塔问题");
for(i=0;i<20;i++)   printf("*");
printf("\n");
}
void jd()
{
for(int i=0;i<20;i++)   printf("*");printf("用程序解决");
for(i=0;i<20;i++)   printf("*");printf("\n");
}
void yuanti()
{   printf("原题:\n现在有三根相邻的柱子\n标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不\n同大小的圆盘,现在把所有盘子一个一个移动到柱子B上\n并且每次移动同一根柱子上都不能出现大盘子在小盘子\n上方请问至少需要多少次移动\n");
}
void move(int n,char one,char two,char three)
{   
void show(char x,char y);
if(n==1)
show(one,three);    
else
{move(n-1,one,three,two);
show(one,three);
move(n-1,two,one,three);}
}
void show(char x,char y)
{
b++;    
printf("第%d次的移动:%c--->%c\n",b,x,y);
}
void main()
{   
void bt();  
void ps();
void yuanti();
void jd();
ps();
bt();   
ps(); 
yuanti();
printf("\n"); 
jd(); 
printf("\n");
void move(int n,char one,char two,char three);
int m;
printf("有几个盘子:");
scanf("%d",&m);
printf("移动方案为:\n");
move(m,'A','B','C');
}

汉诺塔问题,解析_第1张图片

你可能感兴趣的:(数据结构与算法,c语言)