本文是一個漢諾塔的非遞迴演算法,但是我疑問的為什麼最大隻能夠輸入31?超過就顯示不能正確執行程式?
#include<iostream>using namespace std;//圓盤的個數最多為64const int MAX=64;//用來表示每根柱子的資訊structst{int s[MAX]; //柱子上的圓盤儲存情況int top; //棧頂,用來最上面的圓盤char name; //柱子的名字,可以是A,B,C中的一個int Top() //取棧頂元素{return s[top];}int Pop()//出棧{return s[top--];}void Push(int x)//入棧{s[++top]=x;}};long Pow(int x,int y);//計算x^yvoid Creat(st ta[],int n);//給結構數組設定初值void Hannuota(st ta[],long max);//移動漢諾塔的主要函數int main(void){int n;cin>>n;//輸入圓盤的個數st ta[3];//三根柱子的資訊用結構數組儲存Creat(ta,n);//給結構數組設定初值long max=Pow(2,n)-1;//動的次數應等於2^n-1Hannuota(ta,max);//移動漢諾塔的主要函數system("pause");return 0;}void Creat(st ta[],int n){ta[0].name='A';ta[0].top=n-1;//把所有的圓盤按從大到小的順序放在柱子A上for(int i=0;i<n;i++)ta[0].s[i]=n-i;//柱子B,C上開始沒有沒有圓盤ta[1].top=ta[2].top=0;for(i=0;i<n;i++)ta[1].s[i]=ta[2].s[i]=0;//若n為偶數,按順時針方向依次擺放ABCif(n%2==0){ta[1].name='B';ta[2].name='C';}else//若n為奇數,按順時針方向依次擺放ACB{ta[1].name='C';ta[2].name='B';}}long Pow(int x,int y){long sum=1;for(int i=0;i<y;i++)sum*=x;return sum;}void Hannuota(st ta[],long max){int k=0;//累計移動的次數int i=0;int ch;while(k<max){//按順時針方向把圓盤1從現在的柱子移動到下一根柱子ch=ta[i%3].Pop();ta[(i+1)%3].Push(ch);cout<<++k<<":"<<"Movedisk"<<ch<<"from"<<ta[i%3].name<<"to"<<ta[(i+1)%3].name<<endl;i++;//把另外兩根柱子上可以移動的圓盤移動到新的柱子上if(k<max){//把非空柱子上的圓盤移動到空柱子上,當兩根柱子都為空白時,移動較小的圓盤if(ta[(i+1)%3].Top()==0||ta[(i-1)%3].Top()>0&&ta[(i+1)%3].Top()>ta[(i-1)%3].Top()){ch=ta[(i-1)%3].Pop();ta[(i+1)%3].Push(ch);cout<<++k<<":"<<"Movedisk"<<ch<<"from"<<ta[(i-1)%3].name<<"to"<<ta[(i+1)%3].name<<endl;}else{ch=ta[(i+1)%3].Pop();ta[(i-1)%3].Push(ch);cout<<++k<<":"<<"Movedisk"<<ch<<"from"<<ta[(i+1)%3].name<<"to"<<ta[(i-1)%3].name<<endl;}}}}
糾結了好久我最先想到的是不是我的系統是三十二位的有影響(想法貌似有點搞笑),但是各種機器上都運行了都不合適。
但是後來想想這隻是程式的一種輸入與輸入不影響程式是否開始執行。現在把代碼貼上來大家看看?