PTA 汉诺塔游戏(扩展)

汉诺塔(Hanoi Tower)游戏:

1.有三根杆子A,B,C。A杆上有若干碟子

2.每次移动一块碟子,小的只能叠在大的上面

3.把所有碟子从A杆全部移到C杆上

如果改变游戏的玩法:

不允许直接从最左(右)边移到最右(左)边

即每次移动一定是移到中间杆或从中间移出)

也不允许大盘放到小盘的上面。

问:

每一步应该如何移动?

总共需要移动多少步?

输入格式:

一个整数N,表示A柱上有N个碟子(0<n<=10)。

输出格式:

若干行,即移动的最少步骤的每一步(从哪个柱到哪个柱)

最后一行输出最小的移动步数

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出。例如:

A To B
B To C
A To B
C To B
B To A
B To C
A To B
B To C
8

 

//发布这篇主要是因为做到作业题,在网上没找到题解,类似的也没有。
//就自己写了一篇,和同学一起交流进步
#include<bits/stdc++.h>
using namespace std;
int m=0;
void move(int n,char x,char y)
{
    cout<<x<<" To "<<y<<endl;
    m++;
}
void hanoi(int n,char A,char B,char C)
{
    if(n==1)
    {
        move(n,A,B);
        move(n,B,C);
    }//由于只能一步一步的走,所以move分两步
    else
    {
        hanoi(n-1,A,B,C);//移动上部分
        move(n,A,B);//把下面的部分进行移动
        hanoi(n-1,C,B,A);//移动上部分
        move(n,B,C);//同上
        hanoi(n-1,A,B,C);//移动上部分
    }
}
int main()
{
    int n;
    cin>>n;
    hanoi(n,'A','B','C');
    cout<<m;
    return 0;
}

由于一次只能移动一格


所以当n为1时,直接A->B->C;


这是本人第一篇SCDN,谢谢大家观看,也可以给我提出宝贵建议。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值