175 電路維修 bfs

2021-09-25 20:39:47 字數 2441 閱讀 5717

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

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

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

電路板的整體結構是乙個r行c列的網格(r,c≤500),如下圖所示。

電路.png

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

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

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

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

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

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

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

輸入格式

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

第一行包含乙個整數t,表示測試資料的數目。

對於每組測試資料,第一行包含正整數r和c,表示電路板的行數和列數。

之後r行,每行c個字元,字元是"/「和」"中的乙個,表示標準件的方向。

輸出格式

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

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

資料範圍

1≤r,c≤500

,1≤t≤5

輸入樣例:

13 5

\/\\///

/\\輸出樣例:

樣例解釋

樣例的輸入對應於題目描述中的情況。

只需要按照下面的方式旋轉標準件,就可以使得電源和發動機之間連通。

電路2.png

分析:這個題有點考驗思維了。必須好好的理解。

我們要考慮的是最後到終點的距離,終點是(r,c),起點是(0,0);

注意終點不是最後乙個單元格,而是最後乙個角(即最後乙個單元格的右下角)。

所以,我們並不是按單元格來計算距離,而是按兩個直線相交的角來計算。

所以,我的dp[i][j].表示的是(0,0)到(i,j)這個角的最少距離是多少。

同時我們需要考慮的是(0,0)到(i,j)這個角經過的單元格裡面的『/』和『\』。

想象一下這個過程,如果我要從(0,0)到(1,1)這個角。那我經過的單元格就是graph[1][1],同時(0,0)到(1,1)這個角應該是『\』。所以我們判斷一下graph[1][1]是否等於』\ 『。如果是,則距離為0,不然為1.

在考慮一下(1,1)到(2,0)這個角。我經過的單元格應該是graph[2][1],同時,這個單元格裡面的內容應該為』/』。如果是,則距離為0,不然為1.

同理,其他方向。

我們找到其中的規律,並把其作為方向變數即可。

總之一點,不能在像平常那樣理解陣列下標的意義。

dp[i][j]表示的是角。

最後,這差不多就是乙個最短路問題了。

我們每次應該選擇距離最小的去不斷更新即可。因為這個題,只有兩種距離權值(0或者1)。所以我們可以直接用乙個雙端佇列即可。有點dijiskla的思想吧。

同時注意我們不可以直接用vis[i][j]陣列來標記是否訪問過。

想象一下

dp[i][j] 是0,dp[i-2][j]也是0.

從dp[i][j]到dp[i-1][j+1]的距離為1

從dp[i-2][j]到dp[i-1][j+1]的距離為0.

可是我在更新的時候,更新了dp[i][j]到dp[i-1][j+1].並且把vis[i-1][j+1]標記為訪問過了,那我就不會再繼續更新dp[i-2][j]到dp[i-1][j+1]了。

因為是雙端佇列,所以是可能存在這種情況的。

#include"stdio.h"

#include"string.h"

#include"deque"

#include"algorithm"

using namespace std;

#define inf 1001010

typedef pairpii;

const int dir1[4][2] = ,,,};

const int dir2[4][2] = ,,,};

int t,r,c;

char graph[510][510];

int vis[510][510];

int dp[510][510];

int minx;

int check(int a,int b)

void bfs()

); vis[0][0] = 1;

dp[0][0] = 0;

while(!q.empty())

);else

q.push_back();}}

return ;

}int main()

}

AcWing 175 電路維修(雙端佇列BFS)

我們可以把電路板上的每個格點 橫線與豎線的交叉點 看作無向圖中的節點。若兩個節點 x xx 和 y yy 是某個小方格的兩個對角,則在 x xx 與 y yy 之間連邊。若該方格中的標準件 對角線 與 x xx 到 y yy 的線段重合,則邊權為 0 00 若垂直相交,則邊權為 1 11 說明需要旋...

AcWing 175 電路維修

達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出現了故障,導致無法啟動。電路板的整體結構是乙個 r 行 c 列的網格 r,c 500 如下圖所示。每個格點都是電線的接點,每個格仔都包含乙個電子元件。電子...

電路維修 雙端佇列bfs

傳送門 洛谷p2243 初步判斷,是道最短路的題.首先就是建圖了,對於電路板上的每一對角線,令與讀入方向相同的路徑邊權為0,方向相反的邊權為1.由於只能走斜線,根據網格圖的性質可知橫縱座標之和為奇數的點是到不了的,預設起點為 0,0 0,0 0,0 對此,可以去掉一半的邊 根本就到不了 同時也可以直...