三维最短路

View Code
 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 }