| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 585 人关注过本帖
标题:有个Hanoi(汉诺塔的问题。
只看楼主 加入收藏
神之驱逐
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:136
专家分:436
注 册:2011-11-22
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:3 
有个Hanoi(汉诺塔的问题。
Hanoi(汉诺)塔问题。用递归方解题。
有三个座,分别是A,B,C。A座上有三个盘,盘大小不等。大的在下,小的在上。把这三个盘从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。
三个盘子的移动过程:
1 将A座上2个盘子移动到B座上
2 将A座上1个盘子移动到C座上
3 将B座上2个盘子移动到C座上
由上面分析可知
将A上n-1个盘借助C座先移动到B座上
将A座上剩下的一个盘移动到C座上
将n-1个盘从B座借助于A座移动到C座上
将"one"座上n-1个移到"two"座(借助“three”座)。只是在第一步和第三步中,one ,two ,three和A,B,C 对应关系不同。对第一步,对应关系是one = A ,two = B, three=C.第三步,对应关系是:one=B,two=C, three=A
可以把上面的3个步骤分成两类操作
一:将n-1个盘从一个座移动另一个座上(n>1).它是一个递归过程
二:将1个盘子从一个座上移动另一个座上。
分别用两个函数实现以上的两类操作,用hanoi函数实现上面的第一类操作,用move 函数来实现第二类操作,函数调用hanoi(n,one,two,three)表示将n个盘子从"one " 座移到“three”座的过程(借助“two”座)。函数move(x,y)表示将1个盘子从x座移动y座的过程。x 和y 是代表A,B,C座之一,根据每次不同情况分别取A,B,C代入。

源程序:
#include<stdio.h>
int main()
{
 void hanoi(int n,char one,char two,char three);      //对hanoi函数的说明
 int m;
 printf("input the number of diskes:");
 scanf("%d",&m);
 printf("The step to move %d diskes:\n",m);
 hanoi(m,'A','B','C');
}
 
void hanoi(int n,char one,char two,char three);     //定义hanoi函数
  //将n 个盘从one座借助two座,移到three 座
{
 void move(char x,char y);                   //对move 函数的声明
 if(n==1)
   move(one,three);
 else
 {
  hanoi(n-1,one,three,two);
  move(one,three);
  hanoi(n-1,two,one,three);
  }
}


void move(char x,char y)                // 定义move函数
{
 printf("%c-->%c"x,y);
}

问题:
 hanoi(n-1,one,three,two);
  move(one,three);
  hanoi(n-1,two,one,three);
这几句不理解
这两句中的n-1的值是不是一样的

第一步,对应关系是one = A ,two = B, three=C.第三步,对应关系是:one=B,two=C, three=A
 hanoi(n-1,one,three,two);
  move(one,three);
  hanoi(n-1,two,one,three);

程序中的对应关系好像不对

会的请说一下,谢谢。


搜索更多相关主题的帖子: 移动 
2012-07-11 16:23
seeworld
Rank: 2
等 级:论坛游民
帖 子:19
专家分:39
注 册:2011-10-7
收藏
得分:20 
将n 个盘从one座借助two座,移到three 座
可分成三个步骤:
1、将n - 1 个盘从one座借助three 座,移动到two 座;
   即语句:hanoi(n-1,one,three,two);
2、将one 座的剩下一个盘,从one 座直接移动到three 座;
   即语句:move(one,three);
3、将步骤一中移动到two 座上的n - 1 个盘,从two 座借助one座,移动到three 座;
   即语句:hanoi(n-1,two,one,three);
这样就使得n个盘的操作,降低到n - 1 个盘的操作,继续递归处理,直到为1 个盘使直接移动就行了。
2012-07-11 23:47
神之驱逐
Rank: 6Rank: 6
等 级:侠之大者
威 望:2
帖 子:136
专家分:436
注 册:2011-11-22
收藏
得分:0 
多谢,我明白了。

你在努力,你就在进步!
2012-07-14 18:52
bfmiyt
Rank: 2
等 级:论坛游民
帖 子:18
专家分:17
注 册:2010-6-13
收藏
得分:0 
递归调用
2012-07-14 20:26
快速回复:有个Hanoi(汉诺塔的问题。
数据加载中...
 
   



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

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