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 }


浙公网安备 33010602011771号