ToB企服应用市场:ToB评测及商务社交产业平台

标题: 最短路径C++ [打印本页]

作者: 灌篮少年    时间: 2024-12-21 19:14
标题: 最短路径C++
问题描述

小蓝有一天误入了一个混境之地。
好消息是: 他误打误撞拿到了一张地图,并从中获取到以下信息:
坏消息是:
小蓝可以往上下左右四个方向行走,每走一步耗时一分钟。
小蓝想知道他能否逃离这个混境之地,如果可以逃离这里,输出最少需要消耗多少时间,反之输出-1。
输入格式

第一行输入两个正整数 n, m, 表现矩阵的巨细。
第二行输入四个正整数 A, B, C, D, 表现小蓝当前所在位置的坐标,以及混境之地出口的坐标。
接下来输入 n行, 每行 m个字符, 表现混境之地的地图, 此中#表现墙, 无法通行, .表现普通的道路, k表现散落在地图中的钥匙。
输特别式

输出数据共一行一个字符串:

样例输入1

  1. 5 5
  2. 1 1 5 5
  3. ....#
  4. #..#..
  5. k.#..
  6. .#...
  7. ...#.
复制代码
样例输出1

  1. 12
复制代码
样例表明1


从(1,1)到(5,5)的最短道路为:
问题思绪

本质上这是一个考 最短路径 的问题,用 BFS 办理
有两种情况
1. 图上只有一个钥匙
由于图上只有一个钥匙,且出去的条件中需要一把钥匙。即我们必须颠末钥匙的位置。
假设我到钥匙的路径间隔为w,钥匙到出口路径的间隔为d。
由于走一步算一分钟,则总时长=w+d
关键:
计算 我到钥匙的最短路径 + 钥匙到出口的最短路径
有两个方案:
(1)把钥匙作为出发点,求钥匙-》我的最短路径 + 钥匙-》出口的最短路径。相加得到总体的最短路径
(2)把钥匙作为尽头,求 我-》钥匙的最短路径 + 尽头-》钥匙的最短路径相加得到总体的最短路径
2. 图上有多个钥匙
由于图上有多个钥匙,为了求最短路径,我们需要找出哪个钥匙到起点和尽头的最短路径更短。

思绪

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <queue>
  5. #define x first
  6. #define y second
  7. using namespace std;
  8. typedef pair<int, int> PII;
  9. const int N = 1e3 + 10;
  10. int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
  11. int n, m;
  12. int A, B, C, D;
  13. char g[N][N];
  14. vector<vector<int>> dist1, dist2;
  15. void bfs(int x, int y, vector<vector<int>> &dist)
  16. {
  17.     dist[x][y] = 0;
  18.     queue<PII> q;
  19.     q.push({x, y});
  20.    
  21.     while (q.size())
  22.     {
  23.         auto t = q.front();
  24.         q.pop();
  25.         
  26.         for (int i = 0; i < 4; ++ i )
  27.         {
  28.             int tx = t.x + dx[i], ty = t.y + dy[i];
  29.             if (tx < 0 || ty < 0 || tx >= n || ty >= m || g[tx][ty] == '#')
  30.                 continue;
  31.             if (dist[tx][ty] <= dist[t.x][t.y] + 1)
  32.                 continue;
  33.             dist[tx][ty] = dist[t.x][t.y] + 1;
  34.             q.push({tx, ty});
  35.         }
  36.     }
  37. }
  38. int main()
  39. {
  40.     cin >> n >> m;
  41.     cin >> A >> B >> C >> D;
  42.     A --, B --, C --, D --;
  43.    
  44.     for (int i = 0; i < n; ++ i )
  45.         cin >> g[i];
  46.    
  47.     dist1 = vector<vector<int>>(n, vector<int>(m, 0x3f3f3f3f));
  48.     dist2 = vector<vector<int>>(n, vector<int>(m, 0x3f3f3f3f));
  49.    
  50.     bfs(A, B, dist1);
  51.     bfs(C, D, dist2);
  52.    
  53.     int res = 0x3f3f3f3f;
  54.     for (int i = 0; i < n; ++ i )
  55.         for (int j = 0; j < m; ++ j )
  56.             if (g[i][j] == 'k')
  57.                 res = min(res, dist1[i][j] + dist2[i][j]);
  58.    
  59.     if (res == 0x3f3f3f3f)
  60.         puts("-1");
  61.     else
  62.         cout << res << endl;
  63.    
  64.     return 0;
  65. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao12
3.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4