洛谷 P1457 城堡

2021-09-24 18:15:43 字數 1047 閱讀 2397

給定一張圖,要求輸出聯通塊個數,最大聯通塊,刪除一堵牆後最大聯通塊以及刪除的牆的位置

輸入中每乙個單位的數字告訴我們這個單位的東西南北是否有牆存在。每個數字是由以下四個整數的某個或某幾個或乙個都沒有加起來的。

1: 在西面有牆 2: 在北面有牆 4: 在東面有牆 8: 在南面有牆

二進位制處理一下之後連邊,直接用mp[i][j][k]表示(i,j)的k方向是否聯通

之後dfs/bfs跑一遍聯通塊,記錄各個聯通塊大小,這樣就解決了第一小問

之後其實也很簡單,列舉每一堵牆,如果牆的兩端不是同一聯通塊,就可以成為備選答案

至於有多解時選最靠西的,仍然有多解時選最靠南的,可以先列舉j(1~m),再列舉i(n~1)

看別的題解**都很複雜,這裡放一下簡潔的**

#includeusing namespace std;

int n,m,x,y,opt,mp[100][100][5],sz[10000],bl[100][100],cnt,ans1,ans2;

const int dx[5]=,dy[5]=;

void dfs(int xx,int yy)

}int main()

for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!bl[i][j])

sz[++cnt]=1,bl[i][j]=cnt,dfs(i,j),ans1=max(ans1,sz[bl[i][j]]);

//跑dfs找聯通塊

for(int j=1;j<=m;j++)

for(int i=n;i>=1;i--)

//判斷是否有牆,牆兩端是否為不同聯通塊,是否比當前答案更大

cout << cnt << endl << ans1 << endl << ans2 << endl << x << " " << y << " ";

if(opt==2)cout << "n" << endl;

else cout << "e" << endl;

//依次輸出即可

return 0;

}

P1504 積木城堡(洛谷)

xc的兒子小xc最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小xc是乙個比他爸爸xc還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。小xc想把自己壘的城堡送給幼兒園裡漂亮的女孩子...

洛谷 積木城堡

初見安 這裡是傳送門 洛谷p1504 xc的兒子小xc最喜歡玩的遊戲用積木壘漂亮的城堡。城堡是用一些立方體的積木壘成的,城堡的每一層是一塊積木。小xc是乙個比他爸爸xc還聰明的孩子,他發現壘城堡的時候,如果下面的積木比上面的積木大,那麼城堡便不容易倒。所以他在壘城堡的時候總是遵循這樣的規則。小xc想...

洛谷P5049 洛谷P5022 題解 旅行

原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...