2301_78389159 2023-05-27 15:56 采纳率: 100%
浏览 71
已结题

设有一m行n列迷宫,O为可到达点,X为不可到达点,S为起点,E为终点,有一小虫,想从S走到E。该虫只能上、下、左、右四个方向移动,且不能出界。求从S到E的最短“可行”路线.

设有一m行n列迷宫,O为可到达点,X为不可到达点,S为起点,E为终点,有一小虫,想从S走到E。该虫只能上、下、左、右四个方向移动,且不能出界。求从S到E的最短“可行”路线.

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-27 18:19
    关注
    • 以下回答由chatgpt基于相关博客总结生成:

      我可以给出一个经典的解决方案:广度优先搜索算法(BFS)。以下是具体的步骤:

      1.定义一个Node结构体,包含横坐标x、纵坐标y和当前位置走到的步数step。同时定义一个visited数组,记录每个位置是否被访问过(避免重复访问)。

      struct Node{ int x; int y; int step; }; bool visited[MAX][MAX];

      2.定义一个队列queue,初始状态将起点S入队列,并将S的visited值设为true。

      queueque; que.push((Node){start_x, start_y, 0}); visited[start_x][start_y] = true;

      3.定义四个方向向量dx[]和dy[],用于表示上下左右四个方向,同时通过循环遍历每个在队列中的节点,对其四个方向进行拓展,即向队列中添加新的节点,并将其visited值设为true。

      int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1}; while(!que.empty()){ Node now = que.front(); que.pop(); for(int i = 0; i < 4; i++) { int nx = now.x + dx[i]; int ny = now.y + dy[i]; if(nx >= 0 && nx < m && ny >= 0 && ny < n && map[nx][ny] == O && !visited[nx][ny]) { que.push((Node){nx, ny, now.step + 1}); visited[nx][ny] = true; if(nx == end_x && ny == end_y){ return now.step + 1; } } } }

      4.最后,如果队列中没有节点了,则表示无法到达终点E,返回-1.

      完整代码如下:(其中MAX表示迷宫的大小,m、n分别为行数和列数,start_x、start_y、end_x、end_y分别为起点和终点的横纵坐标,map表示迷宫的存储,O和X分别表示能够到达和不能到达的格子。)

      include

      include

      include

      include

      using namespace std;

      const int MAX = 1000; int m, n, start_x, start_y, end_x, end_y; char map[MAX][MAX]; bool visited[MAX][MAX];

      struct Node{ int x; int y; int step; };

      int bfs() { memset(visited, 0, sizeof(visited)); int dx[] = {1, -1, 0, 0}; int dy[] = {0, 0, 1, -1};

      queue<Node>que;
      que.push((Node){start_x, start_y, 0});
      visited[start_x][start_y] = true;
      
      while(!que.empty()){
          Node now = que.front();
          que.pop();
          for(int i = 0; i < 4; i++) {
              int nx = now.x + dx[i];
              int ny = now.y + dy[i];
              if(nx >= 0 && nx < m && ny >= 0 && ny < n && map[nx][ny] == 'O' && !visited[nx][ny]) {
                  que.push((Node){nx, ny, now.step + 1});
                  visited[nx][ny] = true;
                  if(nx == end_x && ny == end_y){
                      return now.step + 1;
                  }
              }
          }
      }
      return -1;
      

      }

      int main() { scanf("%d %d", &m, &n); getchar(); for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { scanf("%c", &map[i][j]); if(map[i][j] == 'S') { start_x = i; start_y = j; } else if(map[i][j] == 'E') { end_x = i; end_y = j; } } getchar(); }

      int ans = bfs();
      printf("%d\n", ans);
      
      return 0;
      

      }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 已采纳回答 5月27日
  • 创建了问题 5月27日