캐슬 문제(단순 DFS)
5780 단어 acm 물문제
문제풀이: dfs 연결 블록 문제를 구합니다.방문하지 않은 점에서 출발하여 dfs 이 점 부근에 도착할 수 있는 모든 점, 함수 반환값은 이 점 주위에 방문하지 않았고 도착할 수 있는 모든 점의 수를 합한 것이다.각 반환치의 크기를 비교하면 가장 큰 것은 제목이 요구하는 가장 큰 방의 네모난 숫자이다.만약에 하나의 연결 블록을 구한 후에 모든 방을 덮지 않았다면, 여전히 방이vis가 0이면 다시 연결 블록을 구하고 최대 방의 네모난 블록을 비교한다.다시 블록을 구할 때마다num++를 사용하면 모두 몇 개의 방이 있는지 계산할 수 있다.
생각: 1. & 좋은 기호 2. 다음 단계가 갈 수 있는지 없는지를 판단하고 가야 한다. 3. 줄과 열을 분명히 한 다음에 아래로 써야 한다.
#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)
{
vis[x][y] = num;
int siz1 = 0;
if (x - 1 >= 1 && !vis[x - 1][y] && (room[x][y] & 2) == 0) {
siz1 += dfs (x - 1, y);
}
if (x + 1 <= m && !vis[x + 1][y] && (room[x][y] & 8) == 0) {
siz1 += dfs (x + 1, y);
}
if (y + 1 <= n && !vis[x][y + 1] && (room[x][y] & 4) == 0) {
siz1 += dfs (x, y + 1);
}
if (y - 1 >= 1 && !vis[x][y - 1] && (room[x][y] & 1) == 0) {
siz1 += dfs (x, y - 1);
}
return siz1 + 1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen ("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf ("%d%d", &m, &n);
memset (room, 0, sizeof(room));
memset (vis, 0, sizeof(vis));
maxsiz = 0;
num = 0;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
scanf ("%d", &room[i][j]);
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (!vis[i][j]) {
num++;
int siz = dfs (i, j);
if (siz > maxsiz) {
maxsiz = siz;
}
}
}
}
printf ("%d
%d
", num, maxsiz);
return 0;
}