hdu1253: 胜利大逃亡

hdu1253: http://acm.hdu.edu.cn/showproblem.php?pid=1253
题意:3层迷宫:一个A*B*C的立方体,可以被表示成A个B*C的矩阵,要从(0,0,0)到(A-1,B-1,C-1),若时间小于t,输出时间,否则输出-1. 解法:bfs:开三维数组d[i][j][k]表示在第k个矩阵的点(i,j)上,队列要进点和k。 code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int d[60][60][60];
char v[60][60][120];
struct abc
{
    int k,x,y;
}q[5000*1000];
const int inf=2<<29;
int dx[]={1,-1,0,0};
int dy[]={0,0,-2,2};
int main()
{
    int a,b,c,t,xx,yy,kk,nx,ny,front,rear,cas;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d%d%d",&a,&b,&c,&t);
        getchar();
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                gets(v[i][j]);
            }
        }
        for(int i=0;i<a;i++)
        {
            for(int j=0;j<b;j++)
            {
                for(int m=0;m<2*c;m++)
                    d[i][j][m]=inf;
            }
        }
        d[0][0][0]=0;
        front=0;rear=0;q[rear].k=0;q[rear].x=0;q[rear++].y=0;
        while(front<rear)
        {
            kk=q[front].k;xx=q[front].x;yy=q[front++].y;
            for(int i=0;i<4;i++)
            {
                nx=xx+dx[i];ny=yy+dy[i];
                if(nx>=0&&nx<b&&ny>=0&&ny<2*c-1&&v[kk][nx][ny]=='0'&&(d[kk][nx][ny]>d[kk][xx][yy]+1))
                {
                    d[kk][nx][ny]=d[kk][xx][yy]+1;
                    q[rear].k=kk;q[rear].x=nx;q[rear++].y=ny;
                }
            }
            if(kk+1<a&&v[kk+1][xx][yy]=='0'&&d[kk+1][xx][yy]>d[kk][xx][yy]+1)
            {
                d[kk+1][xx][yy]=d[kk][xx][yy]+1;
                q[rear].k=kk+1;q[rear].x=xx;q[rear++].y=yy;
            }
            if(kk-1>=0&&v[kk-1][xx][yy]=='0'&&d[kk-1][xx][yy]>d[kk][xx][yy]+1)
            {
                d[kk-1][xx][yy]=d[kk][xx][yy]+1;
                q[rear].k=kk-1;q[rear].x=xx;q[rear++].y=yy;
            }
        }
        if(d[a-1][b-1][2*c-2]>t)
            printf("-1\n");
        else
            printf("%d\n",d[a-1][b-1][2*c-2]);
    }
}
/*input:
1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0
output:
11*/

posted on 2012-07-25 16:40  acmer-jun  阅读(153)  评论(0编辑  收藏  举报

导航