在乙個邊權只有0
、1
的無向圖中搜尋最短路徑可以使用雙端佇列進行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
次對應的電子元件。
在乙個邊權只有0
、1
的無向圖中搜尋最短路徑可以使用雙端佇列進行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 遍歷標...