poj2225---Asteroids!(简单三维搜索)

题目大意:

给定一个三维空间,有些点能走有些点不能走,每次只能上下,左右,前后六个方向走,给定起始坐标和终点坐标,求从起点到终点最短的路径。

注意:

图是按z,y,x给出的,所以在获取起点和终点时也是按z,y,x获取

View Code
 1 //Accepted    192K    16MS    C++    1395B
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 #define MAX 15
 7 struct node{
 8     int x,y,z,d;
 9 }start,end;
10 char map[MAX][MAX][MAX];
11 int useif[MAX][MAX][MAX];
12 int n;
13 int dx[6] = {0,0,1,-1,0,0};
14 int dy[6] = {0,0,0,0,1,-1};
15 int dz[6] = {1,-1,0,0,0,0};
16 int cmp(node temp)
17 {
18     if(temp.x >=0 && temp.x < n && temp.y >= 0 && temp.y < n && temp.z >= 0 && temp.z < n)
19         return 1;
20     return 0;
21 }
22 void bfs()
23 {
24     queue <node> Q;
25     node temp;
26     while(!Q.empty()) Q.pop();
27     memset(useif,0,sizeof(useif));
28     start.d = 0;
29     useif[start.x][start.y][start.z] = 1;
30     Q.push(start);
31     while(!Q.empty())
32     {
33         start = Q.front();
34         Q.pop();
35         if(start.x == end.x && start.y == end.y && start.z == end.z)
36         {
37             printf("%d %d\n",n,start.d);
38             return ;
39         }
40         for(int i = 0 ;i < 6; ++i)
41         {
42             temp.x = start.x + dx[i];
43             temp.y = start.y + dy[i];
44             temp.z = start.z + dz[i];
45             temp.d = start.d + 1;
46             if(cmp(temp) && useif[temp.x][temp.y][temp.z] == 0 && map[temp.x][temp.y][temp.z] == 'O')
47             {
48                 useif[temp.x][temp.y][temp.z] = 1;
49                 Q.push(temp);
50             }
51         }        
52     }
53     printf("NO ROUTE\n");
54 }
55 
56 int main(void)
57 {
58     char s[10];
59     int i,j;
60     while(scanf("%s%d",s,&n)!=EOF)
61     {
62         for(i=0;i<n;i++)
63             for(j=0;j<n;j++)
64                 scanf("%s",&map[i][j]);
65         scanf("%d%d%d%d%d%d%s",&start.z,&start.y,&start.x,&end.z,&end.y,&end.x,s);
66         bfs();
67     }
68     return 0;
69 }
posted @ 2012-09-26 14:41  Wheat″  阅读(175)  评论(0)    收藏  举报