| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 953 人关注过本帖
标题:请教一个汉诺塔问题的升级版!规定起始与结束位置!
取消只看楼主 加入收藏
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:5 
请教一个汉诺塔问题的升级版!规定起始与结束位置!
经典的三柱汉诺塔基本能理解
但是刷到了这样一道题
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

大致题意就是规定了各个圆盘的起始位置 与结束位置 求移动的最少步数
初步的想法是 先倒推如果圆盘已经在目标柱则不用动,从而得出标号最大的需要移动的圆盘,而在它及它以前的圆盘全部需要移动
但之后怎么弄 实在没有头绪。。
我有答案但是不理解其中的other用来干嘛 递归函数也没看懂
求各位dalao帮个忙 解释一下可以么
搜索更多相关主题的帖子: 经典的 最大的 
2016-10-10 19:15
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define M 70
int start[M], targe[M];
long long f(int *p, int k, int fina)
{
  if(k==0) return 0;
  if(p[k]==fina) return f(p,k-1,fina);
  return f(p,k-1,6-fina-p[k])+(1LL<<(k-1));
}
int main ()
{
  long long ans;
  int n;
  while(scanf("%d",&n),n)
   {
      int i;
      for(i=1;i<=n;i++) scanf("%d",&start[i]);
      for(i=1;i<=n;i++) scanf("%d",&targe[i]);
      int c=n;
      for(;c>=1&&start[c]==targe[c];c--);
        if(c==0)
          {
            printf("0\n"); continue;
          }
      int other=6-start[c]-targe[c];
      ans=f(start,c-1,other)+f(targe,c-1,other)+1;
      printf("%lld\n",ans);
    }
  return 0;
}


答案在这
2016-10-10 19:24
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
收藏
得分:0 
求助dalao
2016-10-10 20:23
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
收藏
得分:0 
回复 4楼 yangfrancis
递归函数内的能理解吗
或者说说你大致的思路也可以
谢谢了
2016-10-10 20:37
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
收藏
得分:0 
回复 6楼 yangfrancis
这题网上都找不到原题。。
能参考的太少了
2016-10-10 21:11
沙普格瑞特
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2016-10-5
收藏
得分:0 
这个世界需要更多dalao
2016-10-10 21:43
快速回复:请教一个汉诺塔问题的升级版!规定起始与结束位置!
数据加载中...
 
   



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

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