第七章 递推与递归_第2课 移梵塔(hanoi)《聪明人的游戏 信息学探秘.提高篇》

【问题描述】

    有三根柱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

*/




图解汉诺塔问题(递归求解)

图解汉诺塔问题(递归求解)_漂流的云的博客-CSDN博客

如何理解汉诺塔的递归?

如何理解汉诺塔的递归? - 知乎

汉诺塔的图解递归算法

汉诺塔的图解递归算法_汉诺塔递归算法_Rnan-prince的博客-CSDN博客

https://www.cnblogs.com/dmego/p/5965835.html

scratch图解汉诺塔问题

scratch图解汉诺塔问题|少儿编程网


2.3基本算法之递归变递推

OpenJudge - OpenJudge - 题目

1312:【例3.4】昆虫繁殖

信息学奥赛一本通(C++版)在线评测系统

1313:【例3.5】位数问题

信息学奥赛一本通(C++版)在线评测系统

1314:【例3.6】过河卒(Noip2002)

信息学奥赛一本通(C++版)在线评测系统

[NOIP2002 普及组] 过河卒 - 洛谷

1188:菲波那契数列(2)

信息学奥赛一本通(C++版)在线评测系统

1189:Pell数列

信息学奥赛一本通(C++版)在线评测系统

1190:上台阶

信息学奥赛一本通(C++版)在线评测系统

1191:流感传染

信息学奥赛一本通(C++版)在线评测系统

1192:放苹果

信息学奥赛一本通(C++版)在线评测系统

1193:吃糖果

信息学奥赛一本通(C++版)在线评测系统

1194:移动路线

信息学奥赛一本通(C++版)在线评测系统

1195:判断整除

信息学奥赛一本通(C++版)在线评测系统

1196:踩方格

信息学奥赛一本通(C++版)在线评测系统

1197:山区建小学

信息学奥赛一本通(C++版)在线评测系统


NOIP2011普及组 第4题 P1310 表达式的值(栈、表达式计算、递推)

[NOIP2011 普及组] 表达式的值 - 洛谷

NOIP2011提高组第6题 P1315 观光公交(递推分析、贪心)

[NOIP2011 提高组] 观光公交 - 洛谷

【例4.6】数的计数(Noip2001 普及组第1题)

信息学奥赛一本通(C++版)在线评测系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值