标签:
还挺难的,我还是看书知道的
汉诺塔主要是程序需要好好思考,想想还是挺简单的
汉诺塔 |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B |
试题描述
|
经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK。有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子。现在请你编写程序计算如何将这n个盘子按照规则移到C柱子上,每次只能移动一个盘子,移动过程中可以借助B柱子,任意状态,各个柱子的盘子必须小盘在放在大盘子上面。现在输入两个正整数n和m,表示有n个盘子,请你输出第m步的移动方法。
|
输入
|
两个正整数n和m
|
输出
|
第m步的移动方法
|
输入示例
|
3 4
|
输出示例
|
A-->C
|
其他说明
|
数据范围:0<n<16,0<m<2^n。样例说明: 当n=3时,第一步A-->C,第二步A-->B,第三步C-->B,第四步A-->C,第五步B-->A,第六步B-->C,第七步A-->C,本题应该输出第四步A-->C。
|
#include<iostream> using namespace std; void write(int x)//输出函数 { if(x==0) { putchar(‘0‘); return ; } if(x<0) { putchar(‘-‘); x=-x; } int len=0,buf[15]; while(x) { buf[len++]=x%10; x/=10; } for(int i=len-1;i>=0;i--)putchar(buf[i]+‘0‘); return ; } int read()//输入函数 { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘)f=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*f; } int n,m,nthstep=0;//n是有多少个盘子,m是第几步,nthstep表示现在已到了第几步 void move(int n,char a,char c,char b)//移动函数将B柱充当过渡柱,将A柱上的n片移动到C柱上 { if(n==0)return ;//如果盘子被移完了,就结束程序 move(n-1,a,b,c);//先将A柱上前n-1个盘子移到B柱上,将C柱充当过渡柱 nthstep++; if(nthstep==m)//到达了第m步输出结果,结束程序 { cout<<a<<"-->"<<c; exit(0); } move(n-1,b,c,a);//将A柱作为过渡柱,将B柱上的n-1个盘子移到C柱上 return ;//结束 } int main() { n=read(); m=read(); move(n,‘A‘,‘C‘,‘B‘);//将B柱充当过渡柱,将A柱上的n片移动到C柱上 return 0; }
标签:
原文地址:http://www.cnblogs.com/ysmor/p/5686954.html