| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 321 人关注过本帖
标题:汉诺塔问题
只看楼主 加入收藏
bioknight
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-10-28
收藏
 问题点数:0 回复次数:1 
汉诺塔问题
刚学C++,在函数那章的课后练习里看到了汉诺塔问题,我怎么就发现别人写的比我短很多呢?但是别人的好抽象,我看不懂。我感觉我这样写也对,各位高手看看。
#include <iostream.h>
void way(int cengshu,int chushiweizhi,int mubiaoweizhi,int linshiweizhi)
{
    if (cengshu==2)
    {
        cout<<chushiweizhi<<"-->"<<linshiweizhi<<endl<<chushiweizhi<<"-->"<<mubiaoweizhi<<endl<<linshiweizhi<<"-->"<<mubiaoweizhi<<endl;//递归函数的最下层条件。
    }
    else {
        if (chushiweizhi==1&&mubiaoweizhi==3&&linshiweizhi==2)   
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi-1,linshiweizhi+1);//汉诺塔问题任何一步可能遇到的6种情况。我这里的位置是固定的,1为初始,2为临时,3是目标
            cout<<"1-->3"<<endl;                                      //任何层数的汉诺塔问题都可以看成把N-1层从初始位置移到临时位置,
            way(cengshu-1,chushiweizhi+1,mubiaoweizhi,linshiweizhi-1);//初始位置就只剩最大一层了,把它移动到目标位置,
        }                                                             //然后再把临时位置的N-1层移动到目标位置。
        if (chushiweizhi==1&&mubiaoweizhi==2&&linshiweizhi==3)        //N层的临时位置可以看成是N-1层的初始位置...如此往复。
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi+1,linshiweizhi-1);
            cout<<"1-->2"<<endl;
            way(cengshu-1,chushiweizhi+2,mubiaoweizhi,linshiweizhi-2);
        }
        if (chushiweizhi==2&&mubiaoweizhi==3&&linshiweizhi==1)
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi-2,linshiweizhi+2);
            cout<<"2-->3"<<endl;
            way(cengshu-1,chushiweizhi-1,mubiaoweizhi,linshiweizhi+1);
        }
        if (chushiweizhi==2&&mubiaoweizhi==1&&linshiweizhi==3)
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi+2,linshiweizhi-2);
            cout<<"2-->1"<<endl;
            way(cengshu-1,chushiweizhi+1,mubiaoweizhi,linshiweizhi-1);
        }
        if (chushiweizhi==3&&mubiaoweizhi==1&&linshiweizhi==2)
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi+1,linshiweizhi-1);
            cout<<"3-->1"<<endl;
            way(cengshu-1,chushiweizhi-1,mubiaoweizhi,linshiweizhi+1);
        }
        if (chushiweizhi==3&&mubiaoweizhi==2&&linshiweizhi==1)
        {
            way(cengshu-1,chushiweizhi,mubiaoweizhi-1,linshiweizhi+1);
            cout<<"2-->3"<<endl;
            way(cengshu-1,chushiweizhi-2,mubiaoweizhi,linshiweizhi+2);
        }
    }
}
void main()
{
    int cengshu,chushiweizhi=1,mubiaoweizhi=3,linshiweizhi=2;
    cin>>cengshu;
    way(cengshu,chushiweizhi,mubiaoweizhi,linshiweizhi);
}
搜索更多相关主题的帖子: void include 
2012-10-29 10:36
超级菜鸟手
Rank: 3Rank: 3
来 自:太阳系
等 级:论坛游侠
帖 子:34
专家分:109
注 册:2012-10-24
收藏
得分:0 
顶一下 ! 我也是不大理解汉诺塔问题   
2012-10-29 10:56
快速回复:汉诺塔问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016464 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved