我們不斷做著把事情翻譯成語言的工作!
漢諾塔老生常談的問題!
個人體會:一、理解函數(shù)意義和數(shù)據(jù)意義!
二、想象力,就像把一棵二叉樹先展開,再收攏!
直接上代碼(注釋以前寫的):
#include<stdio.h>
int count1,count;//count1,表示第一個圓盤移動的次數(shù)
//count,表示總的移動次數(shù)


/**//*函數(shù)功能:限制移動過程
函數(shù)參數(shù): 整形變量num,表示第n個盤子
自發(fā)性變量 from,表示源木樁
字符型變量to,表示目的木樁
*/

void move(int num,char from,char to)


{
printf("move %d:from %c to %c\n",num,from,to);
count++;
}


/**//*函數(shù)功能:將第n個盤子從源木樁A,借助于木樁C移動到木樁B
函數(shù)參數(shù):n,表示第n個盤子
a,表示源木樁a
b,表示目的木樁b
c,表示過度木樁c*/


/**//*我自己想法:
三個木樁,從第n個盤開始移動,只有當(dāng)其他的盤都在c木樁才能移動n,
同理要將第n-1個盤從c移動到b,要將n-2個盤全部移動到a木樁
*/



void hanoi(int n,char a,char b,char c)


{
if(n==1) //遞歸出口:為什么是n==1?

{
move(n,a,b); //第n個盤子由a->b
count1++;
}
else

{
hanoi(n-1,a,c,b); //將第n-1個盤子,借助于b由a->c
move(n,a,b); //第n個盤子有a->b
hanoi(n-1,c,b,a); //將第n-1個盤子,借助于a有c->b
}
}


int main()


{
int n;
while(n!=0)

{
scanf("%d",&n);
hanoi(n,'A','B','C');
printf("count=%d\n",count);
printf("count1=%d\n",count1);
}
return 0;
}



/**//*通過程序運(yùn)行,我們還可以得到:
當(dāng)n為偶數(shù)時,第一個盤第一次移動移動到c,
當(dāng)n為奇數(shù)時,第一個盤第一次移動到移動到b*/
運(yùn)行結(jié)果:
posted on 2010-09-07 21:56
jince 閱讀(228)
評論(0) 編輯 收藏 引用 所屬分類:
算法設(shè)計與分析