漢諾塔遊戲
Codevs 4835 [遞歸]漢諾塔基本版
輸出最少步數
——>找規律數學推導
int ans=1,n;
int main(){
cin>>n;
ans<<=n;
cout<<ans-1;
}
Codevs 4412 漢諾塔
輸出最少步驟
——>異或比較巧妙
int n;
void dfs(int k,int x,int y){
if(k==1){
if(x==1)cout<<'A';
else{
if(x==2)cout<<'B';
else cout<<'C';
}
cout<<" To ";
if(y==1)cout<<'A';
else{
if(y==2)cout<<'B';
else cout<<'C';
}
cout<<endl;
return;
}
else{
dfs(k-1,x,x^y);
dfs(1,x,y);
dfs(k-1,x^y,y);
}
}
int main(){
cin>>n;
dfs(n,1,3);
return 0;
}
Codevs 3145 漢諾塔遊戲
輸出最少步數和帶圓盤編號的步驟
——>printf快了很多
#include<iostream>
#include<cstdio>
using namespace std;
int n,ans=1;
void dfs(int k,int x,int y){
if(k==1)k+=100;
if(k>100){
char c1,c2;
if(x==1)c1='A';
else{
if(x==2)c1='B';
else c1='C';
}
if(y==1)c2='A';
else{
if(y==2)c2='B';
else c2='C';
}
printf("%d from %c to %c\n",k-100,c1,c2);
return;
}
else{
dfs(k-1,x,x^y);
dfs(k+100,x,y);
dfs(k-1,x^y,y);
}
}
int main(){
cin>>n;
ans<<=n;
cout<<ans-1<<endl;
dfs(n,1,3);
return 0;
}