Openjudge 2815 城堡問題

2021-09-01 23:47:46 字數 1269 閱讀 3571

對於這道題目來說的話,我們的思路是這樣的,我們首先把資料讀進來,然後把color陣列清零。

我們的思路是這樣的的,給每乙個房間設定乙個對應的color陣列,然後color陣列裡面填滿不同的數字,每一種數字都代表著一種聯通的房間。

相互聯通房間裡面,對應的color陣列填的就是相同的數字,然後對每個房間計數,然後比較之後得出最大的計數值就行了。

那我麼怎麼對這房間裡面填不同的數字呢?

那就用深搜進行圖的遍歷就行了。

我們使用for迴圈對整個讀入的rooms陣列進行遍歷,如果它對應的color格仔不為零的話,我們就不進行dfs搜尋,如果為零的話就說明它目前還是乙個單獨的單元格,因為我們在dfs的過程中是要修改對應的color值的。

對於dfs的話,就是dfs遍歷的格式,如果是舊節點的話,我們就return ;

如果是不是的話我們,就進行染色,也就是相對應的寫入color陣列值,在這裡面的話我們順便進行一下,該聯通空間的大小計數,每次進入for迴圈,if判斷條件為真的話,我們就將roomarea清零,然後才進入深搜計數。

roomarea操作完之後,是要先將roomnum++的,這對應這不同的聯通圖。

dfs裡面染色之後,就是深搜的方向了,題目中給的深搜方向是很方便的,我們對於給出的數字進行 1 2 4 8 的與運算,如果是零,就說明這地方沒有磚,我們就可以直接深搜這個方向就可以了。

對於二進位制來說 0001 是1 ,0010 是2, 0100 是4 ,1000 是8 。

#include #include #include using namespace std;

int rooms[60][60],color[60][60];

int maxroomarea=0,roomnum=0;

int roomarea;

void dfs(int i,int k)

roomarea++;

color[i][k]=roomnum;

if ((rooms[i][k]&1)==0) dfs(i,k-1);

if ((rooms[i][k]&2)==0) dfs(i-1,k);

if ((rooms[i][k]&4)==0) dfs(i,k+1);

if ((rooms[i][k]&8)==0) dfs(i+1,k);

}int main()

} memset(color,0,sizeof(color));

for (int i=1;i<=r;i++)

} }cout<

}

OpenJudge 2815 城堡問題

description 1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。input 程式從標準輸...

北京大學OpenJudge 2815 城堡問題

總時間限制 1000ms 記憶體限制 65536kb 描述1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0...

2815 城堡問題

總時間限制 1000ms 記憶體限制 65536kb 123 4567 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0 4面牆。輸入...