POJ 2225

三维最短路

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 }

你可能感兴趣的:(poj)