题目大意:不会看不懂中文吧?
思路:出口已知,因为有个时间限制,当然时间越短越好,所以bfs,不过写得似乎很挫1800多ms,能过,将就着看哈!
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
typedef struct
{
int x,y,z;
int cnt;
}mor;
struct node
{
int x,y,z;
}zit[6]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int map[50][50][50],book[50][50][50],a,b,c,t,flag;
bool pan(int x,int y,int z)
{
if(x>=0&&x<a&&y>=0&&y<b&&z>=0&&z<c)
return true;
return false;
}
void bfs()
{
queue<mor>que;
mor star,now,next;
star.x=star.y=star.z=star.cnt=0;
while(!que.empty())
que.pop();
que.push(star);
book[0][0][0]=1;
int i,j,n;
while(!que.empty())
{
now=que.front();
que.pop();
if(now.cnt>=t)
return ;
for(i=0;i<6;i++)
{
next.x=now.x+zit[i].x;
next.y=now.y+zit[i].y;
next.z=now.z+zit[i].z;
if(pan(next.x,next.y,next.z) && !map[next.x][next.y][next.z] && !book[next.x][next.y][next.z])
{
book[next.x][next.y][next.z]=1;
if(next.x==a-1&&next.y==b-1&&next.z==c-1)
{
flag=0;
printf("%d\n",now.cnt+1);
return ;
}
next.cnt=now.cnt+1;
que.push(next);
}
}
}
return ;
}
int main()
{
int i,j,k,ps;
scanf("%d",&ps);
while(ps--)
{
scanf("%d%d%d%d",&a,&b,&c,&t);
memset(book,0,sizeof(book));
for(i=0;i<a;i++)
for(j=0;j<b;j++)
for(k=0;k<c;k++)
scanf("%d",&map[i][j][k]);
flag=1;
bfs();
if(flag)
printf("-1\n");
}
return 0;
}