達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。
翰翰的家裡有一輛飛行車。
有一天飛行車的電路板突然出現了故障,導致無法啟動。
電路板的整體結構是乙個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 對此,可以去掉一半的邊 根本就到不了 同時也可以直...