最短路径问题 --- 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; }

浙公网安备 33010602011771号