雙端佇列廣度優先搜尋

2021-10-08 12:51:52 字數 2823 閱讀 7066

在乙個邊權只有01的無向圖中搜尋最短路徑可以使用雙端佇列進行bfs。其原理是當前可以擴充套件到的點的權重為0時,將其加入隊首;權重為1時,將其加入隊尾

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。

翰翰的家裡有一輛飛行車。

有一天飛行車的電路板突然出現了故障,導致無法啟動。

電路板的整體結構是乙個r

rr行c

cc列的網格(r,c

≤500

r,c≤500

r,c≤50

0),如下圖所示。

每個格點都是電線的接點,每個格仔都包含乙個電子元件。

電子元件的主要部分是乙個可旋轉的、連線一條對角線上的兩個接點的短電纜。

在旋轉之後,它就可以連線另一條對角線的兩個接點。

電路板左上角的接點接入直流電源,右下角的接點接入飛行車的發動裝置。

達達發現因為某些元件的方向不小心發生了改變,電路板可能處於斷路的狀態。

她準備通過計算,旋轉最少數量的元件,使電源與發動裝置通過若干條短纜相連。

不過,電路的規模實在是太大了,達達並不擅長程式設計,希望你能夠幫她解決這個問題。

注意:只能走斜向的線段,水平和豎直線段不能走。

輸入格式

輸入檔案包含多組測試資料。

第一行包含乙個整數t

tt,表示測試資料的數目。

對於每組測試資料,第一行包含正整數r

rr和c

cc,表示電路板的行數和列數。

之後r

rr行,每行c

cc個字元,字元是/\中的乙個,表示標準件的方向。

輸出格式

對於每組測試資料,在單獨的一行輸出乙個正整數,表示所需的縮小旋轉次數。

如果無論怎樣都不能使得電源和發動機之間連通,輸出no solution。

把乙個網格視為乙個電子元件,在遍歷的過程中只能走斜向的線段,水平和豎直方向不能走。因此

1、從(0,0)點出發不能到達那些x+y奇數的點。所以如果(m + n) & 1 == 1時,此題無解。

2、從任意一點(x,y)出發能夠擴充套件到4個方向(從左上角開始順時針方向,以下皆同)的點有(x−1,y−1)(x−1,y+1)(x+1,y+1)(x+1,y−1)

3、對於任意一點(x,y),對應4個方向的電子元(以左上角為頂點)在陣列中的下標為(x−1,y−1)(x−1,y)(x,y)(x,y−1),如下圖所示:

4、對於任意一點(x,y),對應4個方向上表示通路對應的字元分別是\/\/

5、從任意一點(x,y)出發能夠擴充套件到的點可以分為兩類:一類是權值為0的點,即已經是通路、不需要旋轉對應的電子元件;另一類是權值為1的點,即需要旋轉1次對應的電子元件。

在乙個邊權只有01的無向圖中搜尋最短路徑可以使用雙端佇列進行bfs。其原理是當前可以擴充套件到的點的權重為0時,將其加入隊首;權重為1時,將其加入隊尾

#include #include #include #define x first

#define y second

using namespace std;

const int n = 510;

typedef pairpii;

char g[n][n];

int n, m;

//可以擴充套件到的4個方向的座標差值

int dx = , dy = ;

//可以擴充套件到的4個方向對應的電子元件在g中的下標差值

int ix = , iy = ;

//dis[i][j]表示(0,0)點到(i,j)點距離

//st[i][j]表示(i,j)已經擴充套件過

int dis[n][n], st[n][n];

//cs表示對應4個方向表示通路的字元,注意'\'需要轉義字元

char cs = "\\/\\/";

int bfs()

); //(0, 0)點入隊

while(q.size())

);//邊權為1時,進入隊尾

else q.push_back();}}

}return dis[n][m];

}int main()

return 0;

}

廣度優先搜尋雙佇列通用程式設計模板

廣度優先搜尋主要用於解決求最短問題,如最短路徑,最少變化步數問題等等,思想是從起點出發,按層遍歷,直到搜尋到目標或者已經搜尋完全部區域。通常利用佇列實現廣度優先搜尋,我這裡使用的雙佇列法,用乙個佇列cur表示當前層,next表示由當前層擴充套件的下一層,用雙佇列有個好處是我們只需要定義乙個全域性變數...

搜尋 廣度優先搜尋

廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...

廣度優先搜尋

include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...