杭电 1240题
//广度优先搜索
#include <iostream>
#include <string>
using namespace std;
#define mapsize 10
#define quesize 1100
int dir[6][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}}; //定义6个方向
char map[mapsize][mapsize][mapsize]; //定义三维地图
int sx,sy,sz; //定义起点
int ex,ey,ez; //定义终点
typedef struct node
{
int x;
int y;
int z;
int t; //代表距离
}node;
node bfsqueue[quesize]; //定义广度优先搜索中的队列
int N;
int BFS()
{
int i,j;
int start = 0; //定义队列的头部元素下标
int end = 1; //定义队列的最后一个元素的下一个元素
int cux,cuy,cuz,cut;
while(end!=start) //迭代终止条件
{
node frontnode= bfsqueue[start];
cux = frontnode.x;
cuy = frontnode.y;
cuz = frontnode.z;
cut = frontnode.t;
if(cux == ex && cuy == ey && cuz == ez)
{
return cut;
}
start++; //去除头部元素
for(i=0;i<6;++i)
{
int tempx = cux+dir[i][0];
int tempy = cuy+dir[i][1];
int tempz = cuz+dir[i][2];
if(tempx>=0 && tempx<N && tempy>=0 && tempy<N && tempz>=0 && tempz<N && map[tempx][tempy][tempz]=='O')
{
bfsqueue[end].x = tempx;
bfsqueue[end].y = tempy;
bfsqueue[end].z = tempz;
bfsqueue[end].t = cut+1;
map[tempx][tempy][tempz] = 'X'; //表明该点加入到了队列中
if(bfsqueue[end].x == ex && bfsqueue[end].y == ey && bfsqueue[end].z == ez) //此处加一判断,减少迭代次数
{
return bfsqueue[end].t;
}
end++; //队尾后移
}
}
}
return -1;
}
int main()
{
//freopen("1.txt","r",stdin);
int i,j,k;
char startend[10];
while(cin>>startend)
{
cin>>N;
for(i=0;i<N;++i)
for(j=0;j<N;++j)
for(k=0;k<N;++k)
cin>>map[i][j][k];
cin>>sz>>sy>>sx //此处一定要注意读取的顺序
>>ez>>ey>>ex;
cin>>startend;
//加入出发地
bfsqueue[0].x = sx;
bfsqueue[0].y = sy;
bfsqueue[0].z = sz;
bfsqueue[0].t = 0;
map[0][0][0] = 'X';
int min = BFS();
if(min == -1)
cout<<"NO ROUTE"<<endl;
else
cout<<N<<" "<<min<<endl;
}
return 0;
}