查看: 2311| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

Hanoi problem

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
In the classic problem of the Towers of Hanoi, you have 3 rods and N disks
of different sizes which can slide onto any tower. The puzzle starts with disks
sorted in ascending order of size from top to bottom (e.g., each disk sits on top
of an even larger one). You have the following constraints:
(A) Only one disk can be moved at a time.
(B) A disk is slid off the top of one rod onto the next rod.
(C) A disk can only be placed on top of a larger disk.
Write a program to move the disks from the first rod to the last using Stacks

记得以前毕业的时候都弄不清楚那三行递归是什么意思,今天自己写写居然写出来了,
泪飙~~

上一篇:Microsoft : Find the largest square fits a rectangle
下一篇:Google: 最大无障碍点子矩阵
🔗
 楼主| wwwyhx 2011-7-6 00:26:48 | 只看该作者
全局:
思路:
如果想从a到c移动n个盘子:
1. 需要从a到b移动n-1个盘子
2. 然后将最下边的盘子从a移动到c
3. 移动从b到c移动n-1个盘子

  1. int GetOther(int nFrom, int nTo)
  2. {
  3.         assert(nFrom >= 1 && nFrom <= 3 && nTo >= 1
  4.                 && nTo <= 3 && nFrom != nTo);

  5.         return 6 - nFrom - nTo;
  6. }

  7. void mov(int nPalates, int nFrom, int nTo)
  8. {
  9.         assert(nFrom >= 1 && nFrom <= 3 && nTo >= 1
  10.                 && nTo <= 3 && nFrom != nTo && nPalates >= 0);

  11.         if (0 == nPalates) return;

  12.         int nOther = GetOther(nFrom, nTo);
  13.         mov(nPalates-1, nFrom, nOther);
  14.         cout<<nFrom<<" -> "<<nTo<<endl;
  15.         mov(nPalates-1, nOther, nTo);
  16. }
复制代码
回复

使用道具 举报

🔗
Imbalism 2011-9-24 14:02:53 | 只看该作者
全局:
用stack替代递归

struct Step
{
     char from;
     char temp;
     char to;
     int n;
};

void Move(char from, char temp, char to, int n)
{
     stack< Step > ss;
     Step s = {from, temp, to, n};
     ss.push(s);
     while(ss.size() > 0)
     {
          Step intent = ss.top();
          assert(intent.n != 0);
          if(intent.n == 1)
          {
               cout << "move " << " from " << intent.from << " to " << intent.to << endl;
               ss.pop();
               continue;               
          }
          Step step1 = {intent.from, intent.to, intent.temp, intent.n - 1};
          Step step2 = {intent.from, intent.temp, intent.to, 1};          
          Step step3 = {intent.temp, intent.from, intent.to, intent.n - 1};

          ss.pop();
          ss.push(step3);
          ss.push(step2);
          ss.push(step1);
     }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表