hdu 1997 汉诺塔 判断某一状态是否是在最优路径中
来源:互联网 发布:婚纱影楼网络推广 编辑:程序博客网 时间:2024/06/04 18:16
判断某一状态是否是在最优路径中
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,
后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
若把n个盘子从柱子a通过柱子b移到柱子c,则先把n-1个盘子从柱子a移动柱子b,再把第n个盘子从a移道c,再把n-1个盘子从b移到a。
所以当判断序列是否符合把n个盘子从a移到c时,第n个只能出现在柱子a的最底部,或柱子c的最底部,否则这个序列错的。
当第n个盘子在a的最底部时,则继续判断剩下的序列是否把n-1个盘子从a移到b。
当第n个盘子在c的最底部时,则继续判断剩下的序列是否把n-1个盘子从b移到c。
递归解法
#include <stdio.h>#define N 66int flag;void dfs(int *a,int *b,int *c,int n){ if(!n) { flag = 0; return ; } if(flag) return ; if(b[0] && b[1] ==n) { flag = 1; return ; } if(a[0] && a[1] == n) { a[1] = a[0] - 1; dfs(a+1,c,b,n-1); } else if(c[0] && c[1] == n) { c[1] = c[0] - 1; dfs(b,a,c+1,n-1); }}int main(){ int t,n,a[N],b[N],c[N]; scanf("%d",&t); while(t--) { int i; scanf("%d",&n); scanf("%d",&a[0]); for(i = 1; i <= a[0]; ++i) scanf("%d", a+i); scanf("%d",b); for(i = 1; i <= b[0]; ++i) scanf("%d",b+i); scanf("%d",c); for(i = 1; i <= c[0]; ++i) scanf("%d", c+i); flag = 0; dfs(a,b,c,n); printf(flag ? "false\n" : "true\n"); } return 0;}
非递归解法
#include <stdio.h>#include <string.h>#define N 66int flag;int main(){ int t,n,han[4][N],a,b,c,p[4],tt; scanf("%d",&tt); while(tt--) { int i,j; memset(han,0,sizeof(han)); scanf("%d",&n); for(i = 1; i < 4; ++i) { scanf("%d",&han[i][0]); for(j = 1; j <= han[i][0]; ++j) scanf("%d",&han[i][j]); } a = 1; b = 2; c = 3; p[1] = p[2] = p[3] = 1; flag = 0; for(i = n;i; --i) { if(han[b][p[b]] == i) { flag = 1; break; } else if(han[a][p[a]] == i) { ++p[a]; t = b; b = c; c = t; } else if(han[c][p[c]] == i) { ++p[c]; t = b; b = a; a = t; } } printf(flag ? "false\n" : "true\n"); } return 0;}
- hdu 1997 汉诺塔 判断某一状态是否是在最优路径中
- Android 判断程序在手机中是否是活动状态或者正在运行状态
- 平面中判断点是否在某一三角形内算法 .
- 平面中判断点是否在某一三角形内算法 .
- 平面中判断点是否在某一三角形内算法 .
- js判断对象是否是某一类型
- 判断某一年是否是闰年
- 判断某一年是否是闰年
- 判断某一年是否是闰年
- 判断某一年是否是闰年
- java中判断线程是否是停止状态
- 矩阵中是否出现某一条路径
- 判断数组中是否存在某一元素
- 在ViewPager中判断Frament是否显示状态
- excel中判断一个表中的某一列的数据在另一个表中的某一列中是否存在
- orcale:判断表中某一字段的值是否包含在一传入的变量中
- excel中判断一个表中的某一列的数据在另一列中是否存在
- android判断服务是否是运行状态
- android memory
- 对像序列化为 json 对像
- 8--8将数组a中n个整数按相反顺序存放
- Jboss数据库加密
- WCF入门篇--实现简单的HelloWorld效果
- hdu 1997 汉诺塔 判断某一状态是否是在最优路径中
- 迅雷方舟与花瓣:不一样的“瀑布流”
- 使用Twisted实现一个简单Web服务器
- how to trouble shoot thread hangs
- js操作DropDownList
- 框架frame\frameset\iframe的区别
- OracleParameter 详解
- Android 键盘相关一
- 使用python来嗅探局域网内的QQ号码