码迷,mamicode.com
首页 > 其他好文 > 详细

汉诺塔问题

时间:2016-07-20 09:04:44      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

还挺难的,我还是看书知道的

汉诺塔主要是程序需要好好思考,想想还是挺简单的

汉诺塔
难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
试题描述
    经典的汉诺塔游戏相信很多同学都会玩的,规则就不用赘述,百科一下就OK。有三个柱子A,B,C,A柱子上套有n个大小不等的盘子,任意两个盘子,上面的盘子一定小于下面的盘子。现在请你编写程序计算如何将这n个盘子按照规则移到C柱子上,每次只能移动一个盘子,移动过程中可以借助B柱子,任意状态,各个柱子的盘子必须小盘在放在大盘子上面。现在输入两个正整数n和m,表示有n个盘子,请你输出第m步的移动方法。
输入
两个正整数n和m
输出
第m步的移动方法
输入示例
3 4
输出示例
A-->C
其他说明
数据范围:0<n<16,0<m<2^n。样例说明: 当n=3时,第一步A-->C,第二步A-->B,第三步C-->B,第四步A-->C,第五步B-->A,第六步B-->C,第七步A-->C,本题应该输出第四步A-->C。
#include<iostream>
using namespace std;
void write(int x)//输出函数 
{
    if(x==0)
    {
        putchar(0);
        return ;
    }
    if(x<0)
    {
        putchar(-);
        x=-x;
    }
    int len=0,buf[15];
    while(x)
    {
        buf[len++]=x%10;
        x/=10;
    }
    for(int i=len-1;i>=0;i--)putchar(buf[i]+0);
    return ;
}
int read()//输入函数 
{
    int x=0,f=1;char ch=getchar();
    while(ch<0||ch>9)
    {
        if(ch==-)f=-1;
        ch=getchar();
    }
    while(ch>=0&&ch<=9)
    {
        x=x*10+ch-0;
        ch=getchar();
    }
    return x*f;
}
int n,m,nthstep=0;//n是有多少个盘子,m是第几步,nthstep表示现在已到了第几步 
void move(int n,char a,char c,char b)//移动函数将B柱充当过渡柱,将A柱上的n片移动到C柱上 
{
    if(n==0)return ;//如果盘子被移完了,就结束程序 
    move(n-1,a,b,c);//先将A柱上前n-1个盘子移到B柱上,将C柱充当过渡柱 
    nthstep++;
    if(nthstep==m)//到达了第m步输出结果,结束程序 
    {
        cout<<a<<"-->"<<c;
        exit(0);
    }
    move(n-1,b,c,a);//将A柱作为过渡柱,将B柱上的n-1个盘子移到C柱上 
    return ;//结束 
}
int main()
{
    n=read();
    m=read();
    move(n,A,C,B);//将B柱充当过渡柱,将A柱上的n片移动到C柱上 
    return 0;
}

 

汉诺塔问题

标签:

原文地址:http://www.cnblogs.com/ysmor/p/5686954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!