Problem Description
n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 : 
n=m+p+q
a1>a2>...>am
b1>b2>...>bp
c1>c2>...>cq
ai是A柱上的盘的盘号系列,bi是B柱上的盘的盘号系列, ci是C柱上的盘的盘号系列,最初目标是将A柱上的n个盘子移到C盘. 给出1个系列,判断它是否是在正确的移动中产生的系列.
例1:n=3
3
2
1
是正确的
例2:n=3
3
1
2
是不正确的。
注:对于例2如果目标是将A柱上的n个盘子移到B盘. 则是正确的.
Input
包含多组数据,首先输入T,表示有T组数据.每组数据4行,第1行N是盘子的数目N<=64.
后3行如下
m a1 a2 ...am
p b1 b2 ...bp
q c1 c2 ...cq
N=m+p+q,0<=m<=N,0<=p<=N,0<=q<=N,
Output

            对于每组数据,判断它是否是在正确的移动中产生的系列.正确输出true,否则false
Sample Input
6
3
1 3
1 2
1 1
3
1 3
1 1
1 2
6
3 6 5 4
1 1
2 3 2
6
3 6 5 4
2 3 2
1 1
3
1 3
1 2
1 1
20
2 20 17
2 19 18
16 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

Sample Output
true
false
false
false
true
true

View Code

 1 #include <stdio.h>
 2 #define MAX 66
 3 //using recursion to judge
 4 int hanoi(int n, int *res, int *des, int *mid)
 5 {
 6     if (*mid == n)
 7     {
 8         return 0;
 9     }
10     else if (*res == n)
11     {
12         return hanoi(n - 1, res + 1, mid, des);
13     }
14     else if (*des == n)
15     {
16         return hanoi(n - 1, mid, des + 1, res);
17     }
18     return 1;
19 }
20 int main()
21 {
22     int N, n, i, k;
23     int m, p, q, a[MAX], b[MAX], c[MAX];
24     //input
25     scanf("%d", &N);
26     for (i = 0; i < N; i++)
27     {
28         scanf("%d", &n);
29         scanf("%d", &m);
30         for (k = 0; k < m; k++)
31         {
32             scanf("%d", &a[k]);
33         }
34         scanf("%d", &p);
35         for (k = 0; k < p; k++)
36         {
37             scanf("%d", &b[k]);
38         }
39         scanf("%d", &q);
40         for (k = 0; k < q; k++)
41         {
42             scanf("%d", &c[k]);
43         }
44         //according to input to get the result
45         if (hanoi(n, a, c, b))
46             printf("true\n");
47         else
48             printf("false\n");
49     }
50     return 0;
51 }

Algrithm-recursion

firstly, for A, B, C, you want A->C, so, you will know the biggest one must be on the A or C, if biggest is on B, it will be wrong.

secondly, if the biggest one is on A, then the second biggest one must be moved from A->B.

thirdly, if the biggest one is on C, then the second biggest one have been on B. So, you must be moved from B->C.

according above, you can use recursion easily.

--------------------------------------------------------

Key points

firstly, the recursion is more useful for hanoi, for either recursion, you must to march, and the condition to jump out.

secondly, for either question, you must analyse in advance, then catch the core, don't waste the energy on other useless things.

转载于:https://www.cnblogs.com/chuanlong/archive/2012/10/29/2745370.html

杭电_ACM_汉诺塔VII相关推荐

  1. 汉诺塔VII(递推,模拟)

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. HDU 1997 汉诺塔VII

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  3. 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII

    汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP: ...

  4. 【HDU 1997】汉诺塔VII

    汉诺塔VII(题目链接) 思路 本文参考了下列文章 汉诺塔的回顾和深刻 汉诺塔VII 首先用数组将每一个样例的状态存储 数组的每一行存储一个柱子的状态 每一行的第0列存储柱子上盘子的数目 其后从下到上 ...

  5. 汉诺塔相关介绍及计算

    汉诺塔的相关题目及计算 汉诺塔的相关介绍及分析 简介 经典汉诺塔 求最小移动次数 汉诺塔的相关介绍及分析 简介 前两天无意中提到了汉诺塔就重新刷了一下相关的题目,感觉有些题目有很多巧妙之处,提到汉诺塔 ...

  6. 杭电 汉诺塔问题总结

    看了一下杭电的各种汉诺塔问题,遇到些奇奇葩葩的小问题,也有很多很好的思想,比如最后一题,来来回回的颠倒很有意思.总结一下: Pro.ID 1207 :http://acm.hdu.edu.cn/sho ...

  7. 汉诺塔 问题 VII

    题目链接:汉诺塔问题VII. 题目: 分析: 题目要求我们确定当前状态是否是汉诺塔的正确移动状态 对于N组数据,排列顺序有2的N次方,列举是不行的 所以我们可以选择递归调用 每次我们都能确定最大的盘子 ...

  8. 汉诺塔 问题 VIII

    题目链接: 汉诺塔问题VIII. 题目: 分析: 与汉诺塔VII类似 . 题目要求找出当前步数下的状态 我们知道: N个圆盘的总移动次数 =2的n次方-1 =(2的(n-1)次方-1)+ 1 +(2的 ...

  9. 汉诺塔(三)_栈的应用

    问题 E: 汉诺塔(三) 时间限制: 3 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...

最新文章

  1. linux能用airport吗_苹果下架最后两款 AirPort 产品,正式退出路由器市场
  2. python3精要(21)-函数(2)
  3. 本周阅读清单:从NeurIPS 2020到EMNLP 2020
  4. Inverse of Rows and Columns
  5. c# 设计原则需要学习吗_向最好的学习:产品设计原则
  6. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本,与 netty 相比更具竞争力
  7. 【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记
  8. 配置文件存int类型_Redis详解(五)------ redis的五大数据类型实现原理
  9. Centos6.5 安装Vim7.4
  10. DMA讲解《一》(清华大学)
  11. LeetCode(657)——机器人能否返回原点(JavaScript)
  12. 南京师范大学与南京林业大学计算机,这8所高校“同宗同源”但不同命!有些是“985”,有些却是“双非”?...
  13. python:只想在opencv中显示红色通道?
  14. 软件工程实验报告三--需求分析及文档编写(模板)
  15. dos命令大全 基础命令+网络的常用命令
  16. android截屏大小不一致,Android中的高分辨率屏幕截图
  17. 通信协议之序列化——TLV详解
  18. 基于GITHUB ACTION的定时任务,真香!
  19. Sublime Text的使用代码块安装的模块
  20. 游戏‘微信打飞机 第一课

热门文章

  1. Android应用启动之从Launcher拉起APP(三)
  2. 离开手机的一天 天才小熊猫_文章《熊猫30天》
  3. 【虚拟试衣论文笔记】C-VTON: Context-Driven Image-Based Virtual Try-On Network
  4. 2021.1.30课程摘要(逻辑教育-王劲胜)
  5. 中国古代神器 兵器详解
  6. 用HTML+CSS做一个简单好看的汽车网页
  7. Unity-URP 实现遮挡高亮
  8. 985本科大二,计算机专业,为什么很多普通一本甚至二本三本的都比自己懂得多?
  9. 在计算机技能大赛上的总结发言,我院在全省职业院校技能大赛工作总结交流会上作典型发言...
  10. 简单用CSS实现三角形