博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电_ACM_汉诺塔VII
阅读量:6247 次
发布时间:2019-06-22

本文共 2609 字,大约阅读时间需要 8 分钟。

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
631 31 21 131 31 11 263 6 5 41 12 3 263 6 5 42 3 21 131 31 21 1202 20 172 19 1816 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
 
Sample Output
truefalsefalsefalsetruetrue
View Code
1 #include 
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 //input25 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 result45 if (hanoi(n, a, c, b))46 printf("true\n");47 else48 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

你可能感兴趣的文章
知遇几何
查看>>
学习Linux计划书
查看>>
Android 调用系统播放器
查看>>
抵制代码重写
查看>>
javascript 实现图片的拖动效果
查看>>
linux的strace命令(详解)
查看>>
记一次环保宣传
查看>>
[转]Intel C++编译器的预定义宏(Windows版、Linux版)
查看>>
***测试02------查点总结
查看>>
1Z0-052 中英文解析(2)
查看>>
Android accessibility service detect notification
查看>>
调度器状态机的单片机上用的小系统
查看>>
Windows7与Window2008 64位IIS7上面DCOM配置Excel、Word等
查看>>
绘画与照片修饰
查看>>
Google Adwords关键词即将告别完全精确匹配
查看>>
原生JavaScript文件上传带进度条
查看>>
kong 负载均衡
查看>>
linux快捷键
查看>>
Bugzilla提Bug
查看>>
MySql执行sql文件
查看>>