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,

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;}


原创粉丝点击