汉诺塔问题(Hanoi)
输入格式:
输入为一个整数后面跟三个单字符字符串。 整数为盘子的数目,后三个字符表示三个杆子的编号。
输出格式:
输出每一步移动盘子的记录。一次移动一行。 每次移动的记录为例如3:a->b 的形式,即把编号为3的盘子从a杆移至b杆。 我们约定圆盘从小到大编号为1, 2, …n。即最上面那个最小的圆盘编号为1,最下面最大的圆盘编号为n。
输入样例:
3 a b c
输出样例:
1:a->c
2:a->b
1:c->b
3:a->c
1:b->a
2:b->c
1:a->c
#include<iostream>
using namespace std;
void hnt(char s,char t,char o,int n,int x)//s 起始 t 终点 o 借助的 n要转移的层数,x是要操作的
{
if(n==1)
printf("%d:%c->%c\n",x,s,t);
else
{
hnt(s,o,t,n-1,x);
printf("%d:%c->%c\n",x+n-1,s,t);
hnt(o,t,s,n-1,x);
}
}
int main()
{
int n;
char s,t,o;
cin>>n>>s>>o>>t;
hnt(s,t,o,n,1);
}
上面是第一次写的,然后发现不用x这个变量。
#include<iostream>
using namespace std;
void hnt(char s,char t,char o,int n)//s 起始 t 终点 o 借助的 n要转移的层数
{
if(n==1)
printf("%d:%c->%c\n",1,s,t);
else
{
hnt(s,o,t,n-1);
printf("%d:%c->%c\n",n,s,t);
hnt(o,t,s,n-1);
}
}
int main()
{
int n;
char s,t,o;
cin>>n>>s>>o>>t;
hnt(s,t,o,n);
}
~
遥记大一Hanoi不会做,现在应该是第一次自己写出来Hanoi。
递归函数:忘记这个函数没有完成,就想着这个函数的功能。