数据较小n<=100,所以直接开三维数组表示图也是没关系的,bfs再求最短路径上有很大的优势,因为bfs会形成一个近似圆,并随着搜索近似均匀扩大,所以,最早被搜索到的那一条路径一定是最短的,可以存储走到每一个位置的最短距离
#include<bits/stdc++.h>
using namespace std;
int n;
const int M=105;
char mp[M][M][M];
int mov[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
int vis [M][M][M];
struct node{
int x,y,z;
int step;
node(int a,int b,int c,int k){
x=a;
y=b;
z=c;
step=k;
}
node(){}
};
queue<node> q;
bool check(int x,int y,int z){
return x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n;
}
bool f;
void bfs(){
while(!q.empty()){
node tmp=q.front();
// cout<<tmp.step;
if(tmp.x==n&&tmp.y==n&&tmp.z==n){
cout<<tmp.step<<endl;
f=true;
return ;
}
q.pop();
for(int i=0;i<6;i++){
int xx=tmp.x+mov[i][0];
int yy=tmp.y+mov[i][1];
int zz=tmp.z+mov[i][2];
// cout<<xx<<" "<<yy<<" "<<zz<<endl;
if(check(xx,yy,zz)&&!vis[xx][yy][zz]&&mp[xx][yy][zz]!='*'){
// cout<<"check: "<<xx<<" "<<yy<<" "<<zz<<endl;
int s=tmp.step+1;
vis[xx][yy][zz]=1;
q.push(node(xx,yy,zz,s));
}
}
}
}
int main(){
node p;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
cin>>mp[i][j][k];
}
}
}
vis[1][1][1]=1;
q.push(node(1,1,1,1));
bfs();
if(!f) cout<<"-1"<<endl;
return 0;
}