一現在有一輛救護車上有一個急救病人需要快速送去醫院,但是該城市的有些道路處於擁堵狀態且不能通過。為了能盡快將病人送到醫院,救護車可以聯系交警部門,將一個擁堵路段清理成空閑狀態且最多清理一個擁堵路段。該城市的道路使用一個矩陣來表示,矩陣中標記為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; }