hdoj 1997 汉诺塔VII 《递归》

来源:互联网 发布:趣头条提现是骗局 知乎 编辑:程序博客网 时间:2024/05/01 01:15

汉诺塔VII

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1520    Accepted Submission(s): 996


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
 

Author
Zhousc@ECJTU

 汉诺塔的最优解是先最优将 【1 ,  n-1  】放到B上,然后将 n 放到C上。

汉诺塔每次没有放好的n个盘子都会专注与前n-1个盘子在一处,然后让第n个先完成。

在将 n 从 A (kai)  放到C(jie)上的这个过程开始,n-1不能在C上。

在将 n 从 A (kai ) 放到C(jie)上的这个过程刚结束,n-1一定不在A上。

即n移动的过程中,n-1不在(kai)和(jie)处,在(zhong)的位置。

当n移动结束以后,【1,n-2】会到n(kai)的位置,n-1 到 n ( jie )的位置。

即第n-1个盘子的位置可以和第n个的位置一样(n-1完成移动),或者出现在一个与n到指定地前后不一样的位置(n移动中);


代码:

#include<cstdio>int ss[100];int main(){    int t;scanf("%d",&t);    while (t--)    {        int n,a,pp;scanf("%d",&n);        scanf("%d",&pp);        for (int i=0;i<pp;i++)        {            scanf("%d",&a);            ss[a]=1;        }        scanf("%d",&pp);        for (int i=0;i<pp;i++)        {            scanf("%d",&a);            ss[a]=2;        }        scanf("%d",&pp);        for (int i=0;i<pp;i++)        {            scanf("%d",&a);            ss[a]=3;        }        bool fafe=true;        int aa=3,bb=1;        for (int i=n;i;i--)        {            if (ss[i]!=aa&&ss[i]!=bb)            {                fafe=false;                break;            }            if (ss[i]==aa)            {                bb=6-aa-bb;            }            else            {                aa=6-aa-bb;            }        }        if (fafe)            printf("true\n");        else            printf("false\n");    }    return 0;}


0 0