最短路徑問題 --- 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;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM