我們可以把電路板上的每個格點(橫線與豎線的交叉點)看作無向圖中的節點。若兩個節點 x
xx 和 y
yy 是某個小方格的兩個對角,則在 x
xx 與 y
yy 之間連邊。若該方格中的標準件(對角線)與 x
xx 到 y
yy 的線段重合,則邊權為 0
00;若垂直相交,則邊權為 1
11(說明需要旋轉 1
11 次才能連上)。然後,我們在這個無向圖中求出左上角到右下角的最短距離,就得到了答案。
這是一張邊權要麼是 0、要麼是 1的無向圖。在這樣的圖上,我們可以通過雙端佇列廣搜來計算。演算法的整體框架與一般的廣搜類似,只是在每個節點上沿分支擴充套件時稍作改變。如果這條分支是邊權為0的邊,就把沿該分支到達的新節點從隊頭入隊;如果這條分支是邊權為 1的邊,就像一般的廣搜一樣從隊尾入隊。這樣一來,我們就仍然能保證,任意時刻廣搜佇列中的節點對應的距離值都具有「兩段性」和「單調性」,每個節點第一次被訪問時,就能得到從左上角到該節點的最短距離。
因為每個節點只需要訪問一次,所以演算法的時間複雜度為 o(r
∗c)o(r*c)
o(r∗c)
。本題還有乙個性質,其實網格格點有一半是永遠走不到的(如下圖紅色的點),所以可以特判一下。
細節處理:每個格仔的編號和每個格點的編號不一樣,注意兩對增量陣列的寫法。
;// 當前格點四周的新格點
int dy=
;int ix=
;// 當前格點四周的格仔
int iy=
;char cs[5]
="\\/\\/"
;int n, m;
char g[n]
[n];
int d[n]
[n];
bool st[n]
[n];
// 儲存每個點的最短路是否已經確定
intbfs()
);d[0]
[0]=
0;while
(q.size()
));else q.
push_front()
;}}}
return-1
;// 不會被執行到
}int
main()
return0;
}
AcWing 175 電路維修
達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個 r 行 c 列的網格 r,c 500 如下圖所示。每個格點都是電線的接點,每個格仔都包含乙個電子元件。電子...
175 電路維修 bfs
達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個r行c列的網格 r,c 500 如下圖所示。電路.png 每個格點都是電線的接點,每個格仔都包含乙個電子元件...
電路維修 雙端佇列bfs
傳送門 洛谷p2243 初步判斷,是道最短路的題.首先就是建圖了,對於電路板上的每一對角線,令與讀入方向相同的路徑邊權為0,方向相反的邊權為1.由於只能走斜線,根據網格圖的性質可知橫縱座標之和為奇數的點是到不了的,預設起點為 0,0 0,0 0,0 對此,可以去掉一半的邊 根本就到不了 同時也可以直...