達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。
翰翰的家裡有一輛飛行車。
有一天飛行車的電路板突然出現了故障,導致無法啟動。
電路板的整體結構是乙個 \(r\) 行 \(c\) 列的網格(\(r,c≤500\)),如下圖所示。
每個格點都是電線的接點,每個格仔都包含乙個電子元件。
電子元件的主要部分是乙個可旋轉的、連線一條對角線上的兩個接點的短電纜。
在旋轉之後,它就可以連線另一條對角線的兩個接點。
電路板左上角的接點接入直流電源,右下角的接點接入飛行車的發動裝置。
達達發現因為某些元件的方向不小心發生了改變,電路板可能處於斷路的狀態。
她準備通過計算,旋轉最少數量的元件,使電源與發動裝置通過若干條短纜相連。
不過,電路的規模實在是太大了,達達並不擅長程式設計,希望你能夠幫她解決這個問題。
注意:只能走斜向的線段,水平和豎直線段不能走。
輸入檔案包含多組測試資料。
第一行包含乙個整數 \(t\),表示測試資料的數目。
對於每組測試資料,第一行包含正整數 \(r\) 和 \(c\),表示電路板的行數和列數。
之後 4r$ 行,每行 \(c\) 個字元,字元是"/"
和"\"
中的乙個,表示標準件的方向。
對於每組測試資料,在單獨的一行輸出乙個正整數,表示所需的最小旋轉次數。
如果無論怎樣都不能使得電源和發動機之間連通,輸出no solution
。
資料範圍
\(1≤r,c≤500\),
\(1≤t≤5\)
輸入樣例:
1
3 5\\/\\
\\///
/\\\\
輸出樣例:1
樣例解釋
樣例的輸入對應於題目描述中的情況。
只需要按照下面的方式旋轉標準件,就可以使得電源和發動機之間連通。
把每乙個橫豎交點作為結點,當對角線與電纜重合時,權值為 \(0\),否則為 \(1\)(即旋轉電纜),轉化為從左上角到右小角的最小權值,可利用雙端佇列的bfs
,權值為 \(0\) 則進隊首,否則進隊尾,即每次優先擴充套件權值小的,遍歷到終點時可保證最短。另外,需要注意如何用乙個值表示乙個座標保證值不重複
#includeusing namespace std;
const int n=300000;
int t,n,m,d[n];
char g[505][505];
vector> adj[n];
bool vis[n];
void bfs()}}
}int main()
,dy[4]=;
bool v[n][n],st[n][n];
void bfs()
); while(q.size())
);else
q.push_front();}}
}}int main()
bfs();
printf("%d",d[1][1]);
return 0;
}
AcWing 175 電路維修(雙端佇列BFS)
我們可以把電路板上的每個格點 橫線與豎線的交叉點 看作無向圖中的節點。若兩個節點 x xx 和 y yy 是某個小方格的兩個對角,則在 x xx 與 y yy 之間連邊。若該方格中的標準件 對角線 與 x xx 到 y yy 的線段重合,則邊權為 0 00 若垂直相交,則邊權為 1 11 說明需要旋...
175 電路維修 bfs
達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個r行c列的網格 r,c 500 如下圖所示。電路.png 每個格點都是電線的接點,每個格仔都包含乙個電子元件...
YBTOJ 電路維修
思路 乍一看這題,沒有bfs的頭緒 但是,我們想到了spfa 我們可以把地圖中的每個點看成方格,這樣就有 n 1 m 1 個方格 如果兩點之間有線聯通,那它們之間的邊權就是0,否則就為1 然後spfa就可以了 include include include using namespace std i...