【杭电】[1997]汉诺塔VII
来源:互联网 发布:模拟人生4男性捏脸数据 编辑:程序博客网 时间:2024/06/06 09:52
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
(1)首先判断是不是已经完全放好了或者还没有开始移动,这样就不用考虑是否最优化了,即所有的盘子在C柱上或者所有的盘子在A柱上,这样是合法的,直接输出true。
(2)【我们考虑盘号最大的盘子第n号盘子,移动方向为A–>C,它只可能在A柱或者C柱上,如果在B柱上我们可以直接返回false–①】;
如果盘号最大的盘子在A柱上,说明其它盘子正在进行A–>B的操作,所以考虑移动的那个n-1个盘子,然后同样按①判断,只不过,最大盘号变成了n-1,而移动方向变成了A–>B;
如果盘号最大的盘子在C柱上,说明其它盘子正在进行B–>C的操作,所以考虑移动的那个n-1个盘子,然后同样按①判断,只不过,最大盘号变成了n-1,而移动方向变成了B–>C;
利用递归按这种方式不断地进行①操作。
#include<stdio.h>int map[4][100];int f(int a,int b) { if(a==1) return b==2?3:2; if(a==2) return b==1?3:1; if(a==3) return b==1?2:1;}bool judge(int n,int t1,int t2) { if(n==0) return true; for(int i=0; i<map[0][f(t1,t2)]; i++) if(map[f(t1,t2)][i]==n) return false; for(int i=0; i<map[0][t1]; i++) if(map[t1][i]==n) return judge(n-1,f(t1,t2),t1); for(int i=0; i<map[0][t2]; i++) if(map[t2][i]==n) return judge(n-1,f(t1,t2),t2);}int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); scanf("%d",&map[0][1]); for(int i=0; i<map[0][1]; i++) scanf("%d",&map[1][i]); scanf("%d",&map[0][2]); for(int i=0; i<map[0][2]; i++) scanf("%d",&map[2][i]); scanf("%d",&map[0][3]); for(int i=0; i<map[0][3]; i++) scanf("%d",&map[3][i]); printf("%s\n",judge(n,1,3)?"true":"false"); } return 0;}
题目地址:【杭电】[1997]汉诺塔VII
0 0
- 【杭电】[1997]汉诺塔VII
- 杭电1997汉诺塔VII
- 杭电--1997--汉诺塔VII--数学题
- 【杭电oj】1997 - 汉诺塔VII(递归,思维)
- 杭电 Problem - 1997 汉诺塔VII 【递归&规律】
- 杭电ACM1997——汉诺塔VII
- HDU 1997 - 汉诺塔VII
- HDU 1997 汉诺塔VII
- hdu 1997 汉诺塔VII
- hdu 1997 汉诺塔VII
- hdu 1997 汉诺塔VII
- hdu 1997 汉诺塔VII
- HDU 1997汉诺塔VII
- hdu 1997 汉诺塔VII
- HDU 1997 汉诺塔VII
- HDU 1997 汉诺塔VII
- HDU 1997 汉诺塔VII
- HDU 1997 汉诺塔VII
- r-fcn
- BOW-FisherVector-VLAD
- Matlab取整函数
- XDocument
- 46 求 1+2+....n
- 【杭电】[1997]汉诺塔VII
- cocos2d - JS 本地存储数据
- Android 2048的设计(2)
- opencv如何获得keypoint的坐标
- codeforces 699B One Bomb
- 浅谈 CSS 清除浮动的 6 种方法(转)
- RPM包rpmbuild SPEC文件
- POJ-1797 Heavy Transportation
- 从服务器上传和下载文件方法