这个题其实没什么难度,主要要注意的就是输入数据时候的坐标要与代码其他地方所用的坐标规则保证是一致的就可以了的。
代码如下:
#include<cstdio>
#include<queue>
using namespace std;
typedef struct Point
{int x,y,z;
int timer;
}point;
int dir[6][3]={{0,0,1},{0,0,-1},{1,0,0},{-1,0,0},{0,-1,0},{0,1,0}};
char map[20][20][20];
char s[2][10];
int n,top,flag;
point begin,end;
void BFS(point b)
{
point next;
int i1,j1,k1;
queue<point>q;
b.timer=0;
q.push(b);
flag=0;
while(!q.empty())
{
b=q.front();
q.pop();
map[b.x][b.y][b.z]='X';
if(b.x==end.x&&b.y==end.y&&b.z==end.z)
{
top=b.timer;
flag=1;
return;
}
for(int k2=0;k2<6;k2++)
{
next.x=b.x+dir[k2][0];
next.y=b.y+dir[k2][1];
next.z=b.z+dir[k2][2];
if(next.x<n&&next.y<n&&next.z<n&&next.x>=0&&next.y>=0&&next.z>=0&&map[next.x][next.y][next.z]=='O'&&map[next.x][next.y][next.z]!='X')
{
next.timer=b.timer+1;
q.push(next);
}
}
}
return ;
}
int main()
{
int i,j,k;
while(scanf("%s %d",s[0],&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{getchar();
for(k=0;k<n;k++)
scanf("%c",&map[k][j][i]);
}
scanf("%d%d%d",&begin.x,&begin.y,&begin.z);
scanf("%d%d%d",&end.x,&end.y,&end.z);
scanf("%s",s[1]);
BFS(begin);
if(flag==0)
printf("NO ROUTE/n");
else if(flag==1)
printf("%d %d/n",n,top);
memset(map,'X',sizeof(map));
}
return 0;
}