zoukankan      html  css  js  c++  java
  • 汉诺塔问题(1)

    View Code
    
    
    //**************************************************

    Description

    问题的提出:约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆(分别使A、B、C),最左边的杆上自上而下、

    由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动一个盘,且不允许大盘

    放在小盘的上面。这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘

    上面,所以64个盘的移动次数是:18446744073709551615
    这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小

    N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

    Input

    测试数据有多组,每组此时数据就包含一个要移动的盘数n,为了使题目简单话,则n<=10。输入0表示结束。

    Output

    输出每组移动的步骤,并每十步换一行,格式如样例输出。并且每组之间空一行,但最后一组例外。

    Sample Input :   3

    Sample Output:   A-->C A-->B C-->B A-->C B-->A B-->C A-->C

    //****************************************************
    #include<iostream>
    using namespace std;
    int k;
    int xx;
    void move( int n , char x , char y , char z )
    {
    if( n == 1 )
    {
    printf(
    "%c-->%c" , x , z ); //把A座上剩下的一个盘移到C座上;
    k++;
    if(k%10&&k&&k!=xx) cout<<" ";
    if(k%10==0&&k) cout<<endl;
    return ;
    }
    move( n
    - 1 , x , z , y ); //将A上n-1个盘子借助C座线移到B座上
    printf( "%c-->%c" , x , z );
    k
    ++;
    if(k%10&&k&&k!=xx) cout<<" ";
    if(k%10==0&&k) cout<<endl;

    move( n
    - 1 , y , x , z ); //将n-1个盘从B座借助于A座移到C座上
    }
    int main()
    {
    int n;
    while( cin>>n , n )
    {
    k
    =0;
    xx
    =1;
    for(int i=1;i<=n;i++)
    xx
    *=2;
    xx
    =xx-1;
    move( n ,
    'A' , 'B' , 'C' );
    cout
    <<endl<<endl;
    }
    return 0;
    }
  • 相关阅读:
    10、驱动中的阻塞与非阻塞IO
    8、Linux设备驱动的并发控制
    入职一个月考核学习
    5、映射的思考
    6、udev机制
    7、字符设备系统
    linux 内存管理之kmalloc、vmalloc、malloc、get_gree_pages的区别
    嵌入式笔试题(linux基础)
    驱动总结
    系统移植总结
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/2014880.html
Copyright © 2011-2022 走看看