水题 第四站 HDU 汉诺塔VII

先来回忆一下汉诺塔

A,B,C,三个塔将A塔上的n块砖转移到C塔,首先将(n-1)块砖转移到B塔,将第n块砖转移到C塔,再将B塔上的(n-1)块砖转移到C塔,所以

函数为借助B塔,将A塔的砖转移到C塔,

首先是借助C塔,将A塔的砖转移到B塔,

然后是借助A塔,将B塔的砖转移到C塔。

附上网上的代码,有助于理解,出处

http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <string.h>
 6 using namespace std;
 7 int i=1;
 8 void move(int n, char from, char to)
 9 {
10     printf("第%d步:将%d号盘子%c--->%c\n",i++,n,from,to);
11 }
12 void hanoi(int n,char from,char depend_on, char to)
13 {
14     if(n==1)
15     {
16         move(1,from,to);
17     }
18     else
19     {
20         hanoi(n-1,from,to,depend_on);
21         move(n,from,to);
22         hanoi(n-1,depend_on,from,to);
23     }
24 }
25 int main ()
26 {
27     int n;
28     printf("输入盘子的个数:\n");
29     scanf("%d",&n);
30     char x=‘A‘,y=‘B‘,z=‘C‘;
31     printf("盘子的移动情况如下:\n");
32     hanoi(n,x,y,z);
33     return 0;
34 }

然后这个题目的解题思路是

1.如果第n个盘在A柱上,那么前n-1个盘处于从A柱经过C柱移向B的过程,因此第n-1个盘不可能出现在C柱。

2.如果第n个盘在C柱上,那么前n-1个盘处于从B柱经过A柱移向C的过程,因此第n-1个盘不可能出现在A柱。

代码还没看懂 = =

时间: 2024-12-25 08:44:33

水题 第四站 HDU 汉诺塔VII的相关文章

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

汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,如今要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把 上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上就可以. </pre><p></p>如今是汉若塔II,改为四个塔,開始方程想简单了,不是最优的.给出网上的一种最优解法例如以下:(1)将x(1<=x&l

汉诺塔VII(递推,模拟)

汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1503 Accepted Submission(s): 1077   Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从

HDU2.2.3 (汉诺塔VII)

汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1574 Accepted Submission(s): 1123   Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从

HDU 1997 汉诺塔VII

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1997 Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 : n=m+p+qa1>a2>...>amb1>b2>...>bpc1>c2>...>cqai是A柱上的盘的盘号系

hdu 汉诺塔

汉诺塔思路传送门:http://www.tuicool.com/articles/7FnMVf 下面是我的AC代码和一些特别的注意事项,比如我推导过程中犯得错误和写代码过程中犯的错误. hd 1207 汉诺塔Ⅱ 注意中间变量由于pow()的 存在会比longlong还要大 更别说int了 所以要 unsigned long long 去存 #include <iostream> #include <cmath> using namespace std; typedef unsign

hdu1997 汉诺塔VII(DFS递归调用)

题目详情:传送门 我都要做郁闷了,逻辑一直没错,但是最后一组答案就是过不了.看了几个小时,终于发现问题所在了.我把数组初始化 memset() 函数,放在了自定义函数 Input 中,使用形参的sizeof()作为地址的长度,结果数组没有初始化成功,导致悲剧的诞生.之后我把 memset() 中的地址长度改回数组长度问题终于解决了.刚做这一题时我把它当成栈混洗了,结果一直没琢磨明白.之后在网上一查,恍然大悟.霎时间,感觉好难过,为什么自己就没想到.下面我们来分析一下本题的思路吧. 分析: 这一题

汉诺塔VII

HDU1997  题意:排列汉诺塔需要的最小步数是2^N-1  排列过程中会生成2^N个排列,判断一个序列是否发生了额外的移动步数,也就是完成汉诺塔话费的步数多余2^N-1. 模拟法: 1:在正确的排列中,最大的n盘一定在a或c柱上,否则false 2:如果n在a柱上,剩下n-1个盘处在a->b的过程中 3:如果n在c柱上,剩下n-1个盘处在b->c的过程中 4:重复123直到n=0 可以看出是O(N)的时间复杂度. 1 #include <bits/stdc++.h> 2 usi

水题 第四站 NYOJ Dinner

同样感觉受到了贪心的欺骗,使用C++的string写的,果断超时,忘记了strcmp这个比较字符串的函数 我的代码 1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 #include <algorithm> 5 #include <string.h> 6 using namespace std; 7 8 int main () 9 { 10 int n; 11 str

汉诺塔系列问题

HDU-1207 汉诺塔II 题目链接 https://vjudge.net/problem/HDU-1207 题面 Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘.有预言说,这件事完成时宇宙