三维最短路
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 struct data 7 { 8 int x,y,z; 9 bool operator==(const data &ne)const 10 { 11 return x==ne.x&&y==ne.y&&z==ne.z; 12 } 13 data(){} 14 data(int _x,int _y,int _z){x=_x;y=_y;z=_z;} 15 }; 16 int mark[15][15][15]; 17 char map[15][15][15]; 18 int dr[][3]={0,0,1,0,0,-1,0,1,0,0,-1,0,1,0,0,-1,0,0}; 19 int main() 20 { 21 char s[10]; 22 while(scanf("%s",s)!=EOF) 23 { 24 int n; 25 scanf("%d",&n); 26 for(int i=0;i<n;i++) 27 for(int j=0;j<n;j++) 28 scanf("%s",map[i][j]); 29 data a,t; 30 scanf("%d%d%d",&a.z,&a.y,&a.x); 31 scanf("%d%d%d",&t.z,&t.y,&t.x); 32 queue<data> Q; 33 memset(mark,-1,sizeof(mark)); 34 mark[a.x][a.y][a.z]=0; 35 Q.push(a); 36 scanf("%s",s); 37 bool flag=false; 38 while(!Q.empty()) 39 { 40 a=Q.front(); 41 Q.pop(); 42 if(a==t) 43 { 44 flag=true; 45 break; 46 } 47 int tp=mark[a.x][a.y][a.z]; 48 for(int i=0;i<6;i++) 49 { 50 data b(a.x+dr[i][0],a.y+dr[i][1],a.z+dr[i][2]); 51 if(b.x<0||b.x>=n||b.y<0||b.y>=n||b.z<0||b.z>=n||mark[b.x][b.y][b.z]!=-1||map[b.x][b.y][b.z]=='X') 52 continue; 53 mark[b.x][b.y][b.z]=tp+1; 54 Q.push(b); 55 } 56 } 57 if(flag) 58 printf("%d %d\n",n,mark[t.x][t.y][t.z]); 59 else 60 printf("NO ROUTE\n"); 61 } 62 return 0; 63 }