【问题描述】
有三根柱A、B、C,在A柱上有n块盘片,所有盘片都是大片在下面,小片放在大片上面。并依次编好序号。现要将A上的n块盘片移到C柱上,每次只能移动一片,而且在同一根柱子上必须保持上面的盘片比下面的盘片小,请输出移动方法。
【输入格式】
仅一个整数n(n≤20),表示A柱上的盘片数。
【输出格式】
输出盘片的移动步骤。
【输入样例】
3
【输出样例】
A-1-C
A-2-B
C-1-B
A-3-C
B-1-A
B-2-C
A-1-C
C++参考代码一:
/*
第2课 移梵塔(hanoi)-2019-10-04
1.先调用过程sub (n-1,a,b,c),
把a柱上的前(n-1)片移到b柱,c柱是过渡柱;
2. (a,'-' ,n,'-',c),把a柱上剩下的一片直接移到c柱上;
3.调用sub (n-l,b,c,a),把b柱上的(n-l)片移到c柱上,a柱是过渡柱。
如果n=0,则退出,即结束程序;否则继续往下执行。
*/
#include <bits/stdc++.h>
using namespace std;
void sub(int n,char a,char c,char b)
{
if(n==0)
{
//返回到被调用的位置
return;
}
//1.先调用过程sub (n-1,a,b,c),
//把a柱上的前(n-1)片移到b柱,c柱是过渡柱;
sub(n-1,a,b,c);
// 2. (a,'-' ,n,'-',c),把a柱上剩下的一片直接移到c柱上;
cout<<a<<'-'<<n<<'-'<<c<<endl;
// 3.调用sub (n-1,b,c,a),把b柱上的(n-l)片移到c柱上,a柱是过渡柱。
//如果n=0,则退出,即结束程序;否则继续往下执行。
sub(n-1,b,c,a);
}
int main( void )
{
int n;
cin>>n;
sub(n,'A','C','B');
return 0;
}
/*
作业 10选2 10选3
1.1.6编程基础之一维数组_08:石头剪刀布
http://noi.openjudge.cn/ch0106/08/
2.1.5编程基础之循环控制_16:买房子
http://noi.openjudge.cn/ch0105/16/
3.1.5编程基础之循环控制_18:鸡尾酒疗法
http://noi.openjudge.cn/ch0105/16/
4.【例4.6】数的计数(Noip2001 普及组第1题)
http://ybt.ssoier.cn:8088/problem_show.php?pid=1316
5. 1314:【例3.6】过河卒(Noip2002)
http://ybt.ssoier.cn:8088/problem_show.php?pid=1314
6、NOIP2011普及组 第4题 P1310 表达式的值(栈、表达式计算、递推)
https://www.luogu.org/problemnew/show/P1310
7、NOIP2011提高组第6题 P1315 观光公交(递推分析、贪心)
https://www.luogu.org/problemnew/show/P1315
8.1192:放苹果
http://ybt.ssoier.cn:8088/problem_show.php?pid=1192
9、1193:吃糖果
http://ybt.ssoier.cn:8088/problem_show.php?pid=1193
10、【算法1-4】递推与递归
https://www.luogu.com.cn/training/109
*/
C++参考代码二:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
int c=0;
void move(int disk,char start,char end)
{
printf("step:%d,disk=%d,move %c to %c\n",++c,disk,start,end);
return;
}
//hanoi(disk_num,'A','B','C');
void hanoi(int n,char A,int B,char C)
{
cout<<"n="<<n<<endl;
//disk=1时,直接将disk从A移动到C
if(n==1)
{
move(1,A,C);
}
else
{
//cout<<"n="<<n<<" start&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
//第一步,将n-1个盘从A移动到B,其中C为辅助盘
hanoi(n-1,A,C,B);
cout<<endl;
cout<<"n="<<n<<" start:"<<endl;
//第二步,将n号盘直接从A移动到C
move(n,A,C);
cout<<"n="<<n<<" end"<<endl;
cout<<endl;
hanoi(n-1,B,A,C);//第三步,将B盘上的n-1个盘递归调用
//cout<<"n="<<n<<" end&&&&&&&&&&&&&&&&&&&&&&&"<<endl;
}
cout<<"------------"<<"n="<<n<<"--------------------------"<<endl;
return;//返回到被调用的位置
}
int main( void )
{
int disk_num;
//printf("input disk_num:\n");
scanf("%d",&disk_num);
hanoi(disk_num,'A','B','C');
return 0;
}
/*
作业 10选2 10选3
P1255 数楼梯
https://www.luogu.com.cn/problem/P1255
P1002 过河卒
https://www.luogu.com.cn/problem/P1002
P1044 栈
https://www.luogu.com.cn/problem/P1044
P1028 数的计算
https://www.luogu.com.cn/problem/P1028
P1464 Function
https://www.luogu.com.cn/problem/P1464
P1928 外星密码
https://www.luogu.com.cn/problem/P1928
P2437 蜜蜂路线
https://www.luogu.com.cn/problem/P2437
P1164 小A点菜
https://www.luogu.com.cn/problem/P1164
P1036 选数
https://www.luogu.com.cn/problem/P1036
P1990 覆盖墙壁
https://www.luogu.com.cn/problem/P1990
P3612 [USACO17JAN]Secret Cow Code S
https://www.luogu.com.cn/problem/P3612
P1259 黑白棋子的移动
https://www.luogu.com.cn/problem/P1259
P1010 幂次方
https://www.luogu.com.cn/problem/P1010
P1228 地毯填补问题
https://www.luogu.com.cn/problem/P1228
P1498 南蛮图腾
https://www.luogu.com.cn/problem/P1498
*/
图解汉诺塔问题(递归求解)
如何理解汉诺塔的递归?
汉诺塔的图解递归算法
scratch图解汉诺塔问题
2.3基本算法之递归变递推
1312:【例3.4】昆虫繁殖
1313:【例3.5】位数问题
1314:【例3.6】过河卒(Noip2002)
1188:菲波那契数列(2)
1189:Pell数列
1190:上台阶
1191:流感传染
1192:放苹果
1193:吃糖果
1194:移动路线
1195:判断整除
1196:踩方格
1197:山区建小学
NOIP2011普及组 第4题 P1310 表达式的值(栈、表达式计算、递推)
NOIP2011提高组第6题 P1315 观光公交(递推分析、贪心)
【例4.6】数的计数(Noip2001 普及组第1题)