最短路径问题 --- dfs

一现在有一辆救护车上有一个急救病人需要快速送去医院,但是该城市的有些道路处于拥堵状态且不能通过。为了能尽快将病人送到医院,救护车可以联系交警部门,将一个拥堵路段清理成空闲状态且最多清理一个拥堵路段。该城市的道路使用一个矩阵来表示,矩阵中标记为0的表示该道路处于空闲状态,标记为1的表示处于拥堵状态,救护车到医院的时间使用距离来衡量,在矩阵中走一个方格代表行驶一公里,且只能上下左右走,到医院的所行驶的距离越小即代表所需要的时间越少。给定该城市各道路的状态(矩阵图),救护车(起始坐标)和医院(终点坐标)的位置,请问救护车在交警的协助下,最少需要走多少公里才能到达医院。如果能到达,输出最小的距离,如果不能到达,输出-1。矩阵的范围不超过100*100,拥堵路段的点数不超过50。

例1:

输入:[[0,0,1,0],[0,0,0,0]], start:(0,0), end:(0,3)

输出:3

解释:交警可以将(0,2)拥堵路段清理为空闲状态,start到end的最小距离为3

 

例2:

输入:[[0,1,1,0],[1,0,0,0]], start:(0,0), end:(0,3)

输出:5

解释:交警可以将(1,0)拥堵路段清理为空闲转态,此时start到end的最小距离为5

 

例3:

输入:[[0,1,1,0],[1,1,0,0]], start:(0,0), end:(0,3)

输出:-1

解释:清理一个拥堵路段为空闲转态之后,救护车还是无法到达医院,所以输出-1

DFS-算法

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int nextx[] = {-1, 0, 1, 0};
int nexty[] = {0, -1, 0, 1};
void dfs(vector<vector<int>>&grid, int sx, int sy, int ex, int ey, bool flag, int steps, vector<int>&path, vector<vector<int>>&visited)
{
   // 结束条件,判断是否到达终点
   if (sx == ex && sy == ey)
   {
      path.push_back(steps);
      cout << "arived!!" << steps << endl;
      return;
   }


   // 遍历四个方向
   for (int i = 0; i < 4; i++)
   {
      int newx = sx + nextx[i];
      int newy = sy + nexty[i];
      if (newx >= 0 && newx < static_cast<int>(grid.size()) &&
          newy >= 0 && newy < static_cast<int>(grid[0].size()) &&
          visited[newx][newy] == 0)
      {
         visited[newx][newy] = 1; // 将格子设置为走过
         // 对下一步是否为路障进行分别处理
         if (grid[newx][newy] == 1)
         {
             // 当该点是障碍点,只有没有使用过是才继续dfs查找
             if (!flag)
             {
                dfs(grid, newx, newy, ex, ey, true, steps+1, path, visited);
             }
         }
         else
         {
            dfs(grid, newx, newy, ex, ey, flag, steps+1, path, visited);
         }
         visited[newx][newy] = 0; // 状态回溯,将格子设置为未走 (why)
      }
   }
}

int rescue(vector<vector<int>>& grid, int sx, int sy, int ex, int ey)
{
   vector<int>path;
   vector<vector<int>>visited(grid.size(), vector<int>(grid[0].size()));
   visited[sx][sy] = 1;
   dfs(grid, sx, sy, ex, ey, false, 0, path, visited);
   if (path.size()==0) return -1;
   sort(path.begin(), path.end());
   return path[0];
}

int main()
{
   //vector<vector<int>>grid = {{0,0,1,0}, {0,0,0,0}};
   //int ret = rescue(grid, 0, 0, 0, 3);

   //vector<vector<int>>grid = {{0,1,1,0}, {1,0,0,0}};
   //int ret = rescue(grid, 0, 0, 0, 3);


   vector<vector<int>>grid = {{0,1,1,0}, {1,1,0,0}};
   int ret = rescue(grid, 0, 0, 0, 3);

   cout << "shortest path = " << ret << endl;
   return 0;

}

 

posted @ 2020-03-09 21:01  ren_zhg1992  阅读(1097)  评论(0)    收藏  举报