HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数

三维的问题无非就是变成了6个搜索方向

最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y]

总之,这是很基础的一道题

 

 1 //#define LOCAL

 2 #include <iostream>

 3 #include <cstdio>

 4 #include <cstring>

 5 #include <queue>

 6 #include <algorithm>

 7 using namespace std;

 8 

 9 struct Point

10 {

11     char type;

12     int x, y, z;

13     int steps;

14 }start, end;

15 

16 char map[12][12][12];

17 int dir[6][3] = {{1,0,0}, {-1,0,0}, {0,1,0}, {0,-1,0}, {0,0,1}, {0,0,-1}};

18 char buff[10];

19 int n;

20 

21 bool islegal(int x, int y, int z)

22 {

23     return (x>=0 && x<n && y>=0 && y<n && z>=0 && z<n && map[z][x][y]!='X');

24 }

25 

26 void BFS(void)

27 {

28     queue<Point> qu;

29     start.steps = 0;

30     qu.push(start);

31     while(!qu.empty())

32     {

33         Point now = qu.front();

34         if(now.x==end.x && now.y==end.y && now.z==end.z)

35         {

36             printf("%d %d\n", n, now.steps);

37             return;

38         }

39         for(int i = 0; i < 6; ++i)

40         {

41             int xx = now.x + dir[i][0];

42             int yy = now.y + dir[i][1];

43             int zz = now.z + dir[i][2];

44             if(islegal(xx, yy, zz))

45             {

46                 Point next;

47                 next.x = xx, next.y = yy, next.z = zz, next.steps = now.steps + 1;

48                 map[zz][xx][yy] = 'X';

49                 qu.push(next);

50             }

51         }

52         qu.pop();

53     }

54     printf("NO ROUTE\n");

55 }

56 

57 int main(void)

58 {

59     #ifdef LOCAL

60         freopen("1240in.txt", "r", stdin);

61     #endif

62 

63     while(cin >> buff >> n)

64     {

65         for(int i = 0; i < n; ++i)

66             for(int j = 0; j < n; ++j)

67                 cin >> map[i][j];

68 

69         cin >> start.x >> start.y >> start.z;

70         cin >> end.x >> end.y >> end.z;

71         cin >> buff;

72         BFS();

73     }

74     return 0;

75 }
代码君

 

你可能感兴趣的:(HDU)