城堡問題(簡單DFS)

2021-07-15 18:31:08 字數 1492 閱讀 7074

2815:城堡問題

檢視 提交 統計 提示 提問

總時間限制: 1000ms 記憶體限制: 65536kb

描述 請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成mn(m≤50,n≤50)個方塊,每個方塊可以有0~4面牆。

輸入 程式從標準輸入裝置讀入資料。第一行是兩個整數,分別是南北向、東西向的方塊數。在接下來的輸入行裡,每個方塊用乙個數字(0≤p≤50)描述。用乙個數字表示方塊周圍的牆,1表示西牆,2表示北牆,4表示東牆,8表示南牆。每個方塊用代表其周圍牆的數字之和表示。城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。輸入的資料保證城堡至少有兩個房間。

輸出 城堡的房間數、城堡中最大房間所包括的方塊數。結果顯示在標準輸出裝置上。

樣例輸入

4 7

11 6 11 6 3 10 6

7 9 6 13 5 15 5

1 10 12 7 13 7 5

13 11 10 8 10 12 13

樣例輸出

5 9

** 1164

題解:dfs求連通塊問題。從乙個沒有訪問過的點出發,dfs此點附近所有可以到達的點,函式返回值是此點周圍所有沒有被訪問過且能到達的點的數目總和。比較各個返回值大小,最大的就是題目要求的最大房間方塊數。如果乙個連通塊求完後沒有覆蓋所有房間,即仍有房間的vis為0,則重新求連通塊,再比較出最大房間方塊數。而每重新求連通塊的時候都使num++,這樣就能算出總共有多少房間。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 55;

int room[maxn][maxn], vis[maxn][maxn], maxsiz, num;

int m, n;

int dfs(int x, int y)

if (x + 1

<= m && !vis[x + 1][y] && (room[x][y] & 8) == 0)

if (y + 1

<= n && !vis[x][y + 1] && (room[x][y] & 4) == 0)

if (y - 1 >= 1 && !vis[x][y - 1] && (room[x][y] & 1) == 0)

return siz1 + 1;

}int main()

}for (int i = 1; i <= m; i++) }}

}printf ("%d\n%d\n", num, maxsiz);

return

0;}

城堡問題 dfs

首先這一題的難度不是很大,但是也要用到位運算的知識,這個讓我想到之前學的位運算遍歷,這裡也是用位運算來判斷乙個點牆的數目。這題思路會有點不好找,但是整體題目難度並不大,適合深搜的入門。圖 一 是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50...

2815 城堡問題(dfs)

總時間限制 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 個方塊,每個方塊可以有...

百練2815 城堡問題(DFS)

總時間限制 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 個方塊,每個方塊可以有...