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*/