答案:搜索一下吧,知道里面很多的!参考资料: http://zhidao.zhaoxi.net/q?word=%BA%BA%C5%B5%CB%FE&ct=17&pn=0&tn=ikaslist&rn=10非递归先必须确定一个移动的方向,比如A->B->C,或者A->C->B,但这个顺序一旦却确定后就不可以再改变了的,否则永远都不会成功。 然后一直按下面两个步骤循环,直到全部完成。 1、把第一片移到下一个位置,比如原来在A,顺序是A->B->C,哪就是移到B,原来在B的就是到C,在C的 就是到A 2、把除第一片以外,可以移动的另外一片移动到可以移动的为止,这个看似模糊,但其实关系是确定的,这个时候只有一片可以移动,而且位置也只有一个可以让它移动。 就是这么两个步骤,用来完成汉诺塔 下面是我的程序 (注:我在程序中作了个弊,如果是奇数片,那顺序一定是A->C->B,(其中A是原柱,B是辅柱,C是目的柱;如果是偶数片,那顺序一定是A->B->C) #include //#include //#include #include void henit(int n, char fromreg, char auxreg, char toreg) { char heni[255] = {0}, tmptoreg; int i; tmptoreg = toreg; if(n%2) { int tmp = auxreg; auxreg = toreg; toreg = tmp; } for (i=1; i<=n; i++) { heni[i] = fromreg; } while (1) { if (heni[1] == fromreg) { heni[1] = auxreg; printf("\t1: %c-->%c\n", fromreg, auxreg); } else if (heni[1] == auxreg) { heni[1] = toreg; printf("\t1: %c-->%c\n", auxreg, toreg); } else if (heni[1] == toreg) { heni[1] = fromreg; printf("\t1: %c-->%c\n", toreg, fromreg); } for (i = 1; heni[i] == tmptoreg && i<=n; i++) ; if(i>n) break; for(i=1;i<=n;i++) if(heni[i] == fromreg) break; if(i>n) { heni[n+1]=fromreg; goto Next; } for(i=1; i<=n; i++) if(heni[i] == auxreg) break; if(i>n) { heni[n+1]=auxreg; goto Next; } for(i=1; i<=n; i++) if(heni[i] == toreg) break; if(i>n) { heni[n+1]=toreg; goto Next; } Next: for(i=2; heni[i] == heni[1] && i<=n ; i++) ; for(int j=i+1; j<=n+1; j++) { if ((heni[j] != heni[1]) && (heni[j] != heni[i]) && (i<=n)) { printf("\t%d: %c-->%c\n", i, heni[i], heni[j]); heni[i] = heni[j]; break; } } } } int main(void) { int n = 0; //time_t start_t, end_t; struct time start_t, end_t; //clrscr(); printf("Input your number:"); scanf("%d", &n); //start_t = time(NULL); gettime(&start_t); henit(n, 'A', 'B', 'C'); //end_t = time(NULL); gettime(&end_t); //printf("Ok,it is down now! use %d seconds", int(end_t - start_t)); printf("Ok,it is down now! use %2d:%02d:%02d.%02d", \ (end_t.ti_hour-start_t.ti_hour), (end_t.ti_min-start_t.ti_min), \ (end_t.ti_sec-start_t.ti_sec), (end_t.ti_hund-start_t.ti_hund)); getchar(); getchar(); return 0; }#include <stdio.h>
#include <stdlib.h>
void Hanoi(int k, char A, char B, char C)
{
if(k > 0)
{
Hanoi(k - 1, A, C, B);
printf("%d : %c -> %c\n", k, A, C);
Hanoi(k - 1, B, A, C);
}
}
int main()
{
//从'A' 移动到 'C'
Hanoi(5, 'A', 'B', 'C');
system("PAUSE");
return 0;
}
非递归的应该用栈,代码比较多。原理是将三个柱看成是一个循环
A -> B -> C -> A 以此类推
若是奇数次移动将最小的移到下一个位置,偶数次移动最小的不懂,
将另外两个柱子中较小的移动到令一个
procedure Hanoi(N,A,B,C:integer;);{以B柱为中转柱将N个盘子从A柱移动到C柱}
begin
if N=1 then write(A,’->’,C){把盘子直接从A移动到C}
else begin
Hanoi(N-1,A,C,B);{ 以C柱为中转柱将N-1个盘子从A柱移动到B柱}
write(A,’->’,C);{把剩下的一个盘子从A移动到C}
Hanoi(N-1,B,A,C); { 以A柱为中转柱将N-1个盘子从B柱移动到C柱}
end;
end;
这里有你想要详细资料 http://zhidao.zhaoxi.net/q?word=%BA%BA%C5%B5%CB%FE&ct=17&pn=0&tn=ikaslist&rn=10可以看下这个页面,有比较详细的介绍 http://hi.zhaoxi.net/271032830/blog/item/ff3bed0f2ccd152e6059f3d6.html
上一个:vb高手进?
下一个:VB解释代码