http://acm.hdu.edu.cn/showproblem.php?pid=1240
三维空间中的BFS求最短路
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int y,x,z;
void init(int ny, int nx, int nz){
x = nx;
y = ny;
z = nz;
}
};
char str[10],map[15][15][15];
int N,y1,x1,z1,y2,x2,z2;
int dis[15][15][15],vis[15][15][15];
int dir[6][3] = {{0, 0, -1},{0, 0, 1},{1, 0, 0},{-1, 0, 0},{0, 1, 0},{0, -1, 0}};///移动数组
bool Isin(int y, int x, int z){
if(y < 0 || y >= N || x < 0 || x >= N || z < 0 || z >= N)
return false;
return true;
}
int bfs(int y, int x, int z){
queue <node> q;
node a,b;
a.init(y, x, z);
while(!q.empty())
q.pop();
vis[a.y][a.x][a.z] = 1;
q.push(a);
while(!q.empty()){
a = q.front();
q.pop();
if(a.x == x2 && a.y == y2 && a.z == z2) return 1;
for(int i=0; i<6; i++){
int yy = a.y + dir[i][0];
int xx = a.x + dir[i][1];
int zz = a.z + dir[i][2];
b.init(yy, xx, zz);
if(!vis[yy][xx][zz] && Isin(yy,xx,zz) && map[zz][yy][xx] != 'X'){
vis[yy][xx][zz] = 1;
dis[yy][xx][zz] = dis[a.y][a.x][a.z] + 1;///最短距离的记录
q.push(b);
}
}
}
return 0;
}
int main(){
// freopen("in.txt", "r", stdin);
while(~scanf("%s%d",str, &N)){
for(int i=0; i<N; i++)
for(int j=0; j<N; j++)
for(int k=0; k<N; k++)
cin >> map[i][j][k];
cin >> y1 >> x1 >> z1;
cin >> y2 >> x2 >> z2;
scanf("%s", str);
memset(vis, 0, sizeof(vis));
memset(dis,0, sizeof(dis));
if(!bfs(y1,x1,z1)) puts("NO ROUTE");
else cout << N << " " << dis[y2][x2][z2] << endl;
}
return 0;
}