漢諾塔問題原始碼詳解,一種比較形象的輸出顯示結果
阿新 • • 發佈:2019-01-09
// Hanoi.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include "stdio.h" #include "iostream.h" char c1[10][19],c2[10][19],c3[10][19];//存放狀態,真實模擬三個塔座。 int MAX=0; int number=3;//3階漢諾塔 void draw()//輸出三個塔座的資訊 { char c; cout<<"按鍵後回車進行下一步"<<endl; cin>>c;//輸入任意字元,此處的作用是用來手動控制移動,輸入一個字元,移動一次。 int j=0; int i=0; for(;i<=9; i++) { for(j=0; j<19; j++) { printf("%c",c1[i][j]); } printf("%s"," "); for(j=0; j<19; j++) { printf("%c",c2[i][j]); } printf("%s"," "); for(j=0; j<19; j++) { printf("%c",c3[i][j]); } printf("\n"); } printf("------------------- ------------------- -------------------\n\n"); } void move(char x[10][19],char y[10][19])//把x塔座最上面一個移動到y塔座的最上面 { MAX++;//控制移動次數加1 int first=0; int second=0; for(int i=0;i<10;i++)//從上到下來找 { if(x[i][8]=='*')//x塔座出現第一行的位置 { first=i; break; } } for(i=9;i>=0;i--)//從下向上來找 { if(y[i][8]!='*')//y塔座第一行上面的位置 { second=i; break; } } for(i=0;i<19;i++) { y[second][i]=x[first][i];//移動,將x塔座最上面一層移動到y塔座最上面 if(i==9)//給x塔座的i層清空。 x[first][i]='|'; else x[first][i]=' '; } draw(); } void hanoi(int n,char one[10][19],char two[10][19],char three[10][19])//漢諾塔原理,遞迴實現 {//將one塔座上的移動到three塔座上,第一步是將one塔座上的n-1個移動到two塔座,第二步將one塔座上的第n個移動到three塔座上, //第三步將two塔座上的n-1個移動到three塔座上。 if(n==1) move(one,three); else { hanoi(n-1,one, three, two); move(one,three); hanoi(n-1,two,one,three); } } void main() { int j=0; int i=0; for(;i<10;i++) { for(j=0;j<19;j++) { if(j==9) { c1[i][j]='|'; c2[i][j]='|'; c3[i][j]='|'; } else { if( i >= 10-number)//共有number階 { int i1=i+number-10+1; if(j>=9-i1&&j<=9+i1) c1[i][j]='*'; else c1[i][j]=' '; } else { c1[i][j]=' '; c2[i][j]=' '; c3[i][j]=' '; } } } } draw(); hanoi(number,c1,c2,c3); printf("一共進行次數為:%d\n",MAX); }