HDU1997:汉诺塔VII

来源:互联网 发布:无限试驾2优化 编辑:程序博客网 时间:2024/06/08 12:21
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
 


 

还是汉诺塔

也是一道规律题

只需要列出几项观察就是了,反正我是把到6个盘的所有状况都罗列了出来

 

规律就是

1:盘为奇数时,最底为奇数的只能在2号柱,底数为偶数的盘只能在1,3号柱

2:偶数与上面相反

3:每一根柱子上的盘是奇偶互换的

 

#include <stdio.h>int fun(int *a,int x){    int i,flag = 1;    for(i = 0; i<x-1; i++)    {        if(a[i]%2 && a[i+1]%2)        {            flag = 0;            break;        }        else if(a[i]%2 == 0 && a[i+1]%2 == 0)        {            flag = 0;            break;        }    }    return flag;}int main(){    int test;    scanf("%d",&test);    while(test--)    {        int n,a[65],b[65],c[65],x,y,z,i,flag = 0,flag2,flag1,flag3;        scanf("%d",&n);        scanf("%d",&x);        for(i = 0; i<x; i++)            scanf("%d",&a[i]);        scanf("%d",&y);        for(i = 0; i<y; i++)            scanf("%d",&b[i]);        scanf("%d",&z);        for(i = 0; i<z; i++)            scanf("%d",&c[i]);        if(n%2)        {            if((a[0]%2 || !x) && (b[0]%2 == 0 || !y) && (c[0]%2 || !z))                flag = 1;        }        else        {            if((a[0]%2 == 0|| !x) && (b[0]%2 || !y) && (c[0]%2 == 0 || !z))                flag = 1;        }        flag1 = fun(a,x);        flag2 = fun(b,y);        flag3 = fun(c,z);        if(flag && flag1 && flag2 && flag3)            printf("true\n");        else            printf("false\n");    }    return 0;}