总时间限制: 1000ms 内存限制: 65536kB

描述

定义一个二维数组:

  1. int maze[5][5] = {
  2. 0, 1, 0, 0, 0,
  3. 0, 1, 0, 1, 0,
  4. 0, 0, 0, 0, 0,
  5. 0, 1, 1, 1, 0,
  6. 0, 0, 0, 1, 0,
  7. };

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

输出

左上角到右下角的最短路径,格式如样例所示。

样例输入

  1. 0 1 0 0 0
  2. 0 1 0 1 0
  3. 0 0 0 0 0
  4. 0 1 1 1 0
  5. 0 0 0 1 0

样例输出

  1. (0, 0)
  2. (1, 0)
  3. (2, 0)
  4. (2, 1)
  5. (2, 2)
  6. (2, 3)
  7. (2, 4)
  8. (3, 4)
  9. (4, 4)

思路

基础广搜. 先将起始位置入队.

每次从队列拿出一个元素, 扩展其相邻的4个元素入队列(要判重), 直到队头元素为终点为止.

队列的元素要记录指向父节点的指针(因为题目要输出路径).

本题不能用STL的 queuedeque, 我们得自己写一个简单队列, 用两个指针(一个指向队头, 一个指向队尾)来维护.

代码如下:

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int maze[8][8];
  5. int visited[8][8]; // 判重
  6. int xAxis[4] = {-1, 1, 0, 0}; // 横坐标4个方向
  7. int yAxis[4] = {0, 0, -1, 1}; // 纵坐标4个方向
  8. typedef struct Node {
  9. int row;
  10. int col;
  11. int parentIndex;
  12. }Node;
  13. bool isValidNode(int x, int y) {
  14. if( x < 0 || x >= 5 || y < 0 || y >= 5) // 超过迷宫边界?
  15. return false;
  16. if( visited[x][y] == 0x1 ) // 此节点被访问过了吗?
  17. return false;
  18. if( maze[x][y] == 0x1 ) // 此节点是围墙吗?
  19. return false;
  20. return true;
  21. }
  22. int BFS(Node* queue, int head, int tail) {
  23. while( head != tail ) {
  24. Node tmpHead = queue[head];
  25. if(tmpHead.row == 4 && tmpHead.col == 4) { // 到终点了
  26. return head;
  27. }
  28. for(int i = 0; i < 4; i++) { // 遍历4个方向
  29. int xx = tmpHead.row + xAxis[i];
  30. int yy = tmpHead.col + yAxis[i];
  31. if( isValidNode(xx, yy) ) {
  32. queue[tail].row = xx;
  33. queue[tail].col = yy;
  34. queue[tail].parentIndex = head;
  35. visited[xx][yy] = 0x1;
  36. tail++;
  37. }
  38. }
  39. head++; // 队首节点出队
  40. }
  41. return head;
  42. }
  43. void PrintPath(Node* queue, int head) { // 递归打印路径, 省去反转链表的操作
  44. if( head == 0 )
  45. printf("(0, 0)\n");
  46. else {
  47. if( queue[head].parentIndex != -1 ) {
  48. PrintPath(queue, queue[head].parentIndex);
  49. printf("(%d, %d)\n", queue[head].row, queue[head].col);
  50. }
  51. }
  52. }
  53. int main() {
  54. /* Read data and initialize */
  55. for(int i = 0; i < 5; i++) {
  56. for(int j = 0; j < 5; j++) {
  57. cin >> maze[i][j];
  58. }
  59. }
  60. memset(visited, 0x0, sizeof(visited));
  61. /* Create a queue */
  62. Node* queue = new Node[30];
  63. int queueHead = 0, queueTail = 0;
  64. /* Src node join queue */
  65. queue[0].row = 0;
  66. queue[0].col = 0;
  67. queue[0].parentIndex = -1; // parent is itself
  68. visited[0][0] = 0x1;
  69. queueTail++;
  70. /* BFS and display result */
  71. int result = BFS(queue, queueHead, queueTail);
  72. PrintPath(queue, result);
  73. return 0;
  74. }