Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1997

我的理解

若把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。

 

我的代码 
 1 #include <stdio.h>
2 #include <string.h>
3 const int N=70;
4 int s[4][N],p[4];
5 int main()
6 {
7 int T;
8 scanf("%d",&T);
9 while (T--)
10 {
11 int n,i;
12 scanf("%d",&n);
13 memset(s,0,sizeof(s));
14 for (i=1;i<=3;i++)
15 {
16 int m;
17 scanf("%d",&m);
18 for (int j=1;j<=m;j++) scanf("%d",&s[i][j]);
19 }
20 int a=1,b=2,c=3,flag=1;
21 p[1]=p[2]=p[3]=1;
22 for (i=n;i>0;i--)
23 {
24 if (s[a][p[a]]==i)
25 {
26 p[a]++;
27 c=b; b=6-a-c;
28 }
29 else if(s[c][p[c]]==i)
30 {
31 p[c]++;
32 a=b; b=6-a-c;
33 }
34 else {flag=0; break;}
35 }
36 if (flag) printf("true\n");
37 else printf("false\n");
38 }
39 return 0;
40 }

 

posted on 2011-11-30 08:19  Qiuqiqiu  阅读(360)  评论(0编辑  收藏  举报