信息学奥赛一本通 1205:汉诺塔问题 | OpenJudge NOI 2.2 6261:汉诺塔问题

【题目链接】

[ybt 1205:汉诺塔问题
OpenJudge NOI 2.2 6261:汉诺塔问题

【题目考点】

1. 递归

【解题思路】

设输入的左中右三个杆分别为a,b,c。题目要将摞在a杆上的n层汉诺塔移动到b杆上,在这一过程会借助c杆。

  • 递归问题:将x杆上的k层汉诺塔移动到y杆上,在这一过程中会借助z杆。
  • 递归关系:要想将x杆上的k层汉诺塔移动到y杆,可以先将x杆上的k-1层汉诺塔移动到z杆,借助y杆。
    再将x杆上的圆盘移动到y杆,由于这一层圆盘是k层汉诺塔的底层,那么这个圆盘的编号为k,输出“把k号圆盘从x移动到y”。
    最后将z杆上的k-1层汉诺塔移动到y杆,借助x杆。
  • 递归出口:如果要移动的是0层汉诺塔,那么就不移动了。

【注意】由于输出数据较多,如果用cout输出可能会超时,最好使用scanf与printf。

【题解代码】

解法1:递归
#include <bits/stdc++.h>
using namespace std;
void hanoi(int k, char x, char y, char z)//输出k层汉诺塔从x杆移动到y杆借助z杆的解法
{
    if(k == 0)
        return;
    hanoi(k-1, x, z, y);//将k-1层汉诺塔从x杆移动到z杆借助y杆 
    printf("%c->%d->%c\n", x, k, y);//输出将k号圆盘从x移动到y 
    hanoi(k-1, z, y, x);//将k-1层汉诺塔从z杆移动到y杆借助x杆 
}
int main()
{
    int n;
    char a, b, c;
    scanf("%d %c %c %c", &n, &a, &b, &c); 
    hanoi(n, a, b, c);
    return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值