汉罗塔

来源:互联网 发布:最优化方法陈开周答案 编辑:程序博客网 时间:2024/05/17 04:15

汉罗塔经典移动次数解法和第m次第s个盘子从哪个柱子移动到哪个柱子的公式解法

void han(int n, int m){int s=1,t=2;for (int i=1;i<=n;i++){if(m%t==s) break;s=t;  t*=2;}cout<<s<<'\t';int k=m/t;if(n%2==k%2){if((k+1)%3==1) cout<<1<<'\t'<<3<<endl;if((k+1)%3==2) cout<<3<<'\t'<<2<<endl;if((k+1)%3==0) cout<<2<<'\t'<<1<<endl;}else{if((k+1)%3==1) cout<<1<<'\t'<<2<<endl;if((k+1)%3==2) cout<<2<<'\t'<<3<<endl;if((k+1)%3==0) cout<<3<<'\t'<<1<<endl;}}//递归解法,求不到移动的哪一个盘子void move(int a,int b,int &count){count++;cout<<a<<"--"<<b<<endl;}void hanluota(int n,int a,int b,int c,int&count){if(n==1) move(a,c,count);else{hanluota(n-1,a,c,b,count);move(a,c,count);hanluota(n-1,b,a,c,count);}}


原创粉丝点击