数据较小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;
}