[BAEKJOON] 2234번 성곽

2024. 5. 4. 16:59·Algorithm/BFS

https://www.acmicpc.net/problem/2234

 

문제조건
  1.  굵은 선은 벽을 나타내고, 점선은 벽이 없어서 지나다닐 수 있는 통로
  2. 서쪽에 벽이 있을 때는 1을, 북쪽에 벽이 있을 때는 2를, 동쪽에 벽이 있을 때는 4를, 남쪽에 벽이 있을 때는 8을 더한 값이 주어진다.
    1. 이 성에 있는 방의 개수
    2. 가장 넓은 방의 넓이
    3. 하나의 벽을 제거하여 얻을 수 있는 가장 넓은 방의 크기를 각각 구하시오
접근방법

 

전체 맵을 탐색한다는 점에서 BFS를 떠올릴 수 있었고, 1(2^0), 2(2^1), 4(2^2), 8(2^3) 로 진행할수 있는지 판단해야한다는 점에서 나에겐 조금 생소한 비트마스킹이 생각났다.

 

이 문제에서 핵심은 비트를 1부터 왼쪽으로 Shift연산을 통해 벽에 대해 나타낸 숫자와 &연산으로 겹치는 지 확인 하는 것이다. 또한 하나의 벽을 제거하여 얻을 수 있는 가장 넓은 방의 크기는 Brute Force 방식으로 각 방에 대해서 하나씩 벽을 없애고 최댓값을 갱신했다.

 

소스코드
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int map[51][51], visited[51][51];
int n, m, big, res;
int dy[] = { 0, -1, 0, 1 };
int dx[] = { -1, 0, 1, 0 };

int bfs(int y, int x) {
	queue<pair<int, int> > q;
	q.push({ y,x });
	visited[y][x] = 1;
	int cnt = 1;
	while (!q.empty()) {
		int cury = q.front().first;
		int curx = q.front().second;
		q.pop();
		int bit = 1;
		for (int i = 0; i < 4; i++) {
			if (!(map[cury][curx] & bit)) {
				int ny = cury + dy[i];
				int nx = curx + dx[i];
				if (ny >= m || ny < 0 || nx >= n || nx < 0) continue;
				if (!visited[ny][nx]) {
					visited[ny][nx] = 1;
					q.push({ ny,nx });
					cnt++;
				}
			}
			bit <<= 1;
		}
	}
	return cnt;
}

int main(){
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (!visited[i][j]) {
				big = max(big, bfs(i, j));
				res++;
			}
		}
	}
	cout << res << '\n' << big << '\n';
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			for (int bit = 1; bit <= 8; bit <<= 1) {
				if (map[i][j] & bit) {
					memset(visited, 0, sizeof(visited));
					map[i][j] -= bit;
					big = max(big, bfs(i, j));
					map[i][j] += bit;
				}
			}
		}
	}
	cout << big;
}

 

'Algorithm > BFS' 카테고리의 다른 글

[BAEKJOON] 16946번 벽 부수고 이동하기 4  (0) 2024.05.10
[BAEKJOON] 14503번 로봇 청소기  (0) 2024.04.07
[ BAEKJOON] 2206번 벽 부수고 이동하기  (0) 2024.03.22
[BAEKJOON] 13549번 숨바꼭질3  (0) 2024.03.21
[BAEKJOON] 14940번 쉬운 최단거리  (0) 2024.03.21
'Algorithm/BFS' 카테고리의 다른 글
  • [BAEKJOON] 16946번 벽 부수고 이동하기 4
  • [BAEKJOON] 14503번 로봇 청소기
  • [ BAEKJOON] 2206번 벽 부수고 이동하기
  • [BAEKJOON] 13549번 숨바꼭질3
Ls._.Rain
Ls._.Rain
안되면 될때까지 삽질했던 기록
  • Ls._.Rain
    Ls{Diary}
    Ls._.Rain
  • 전체
    오늘
    어제
    • 분류 전체보기 (136)
      • Github (2)
      • Spring (51)
        • Batch Programming (13)
        • 결제 (4)
        • 대용량 트래픽 (32)
        • OpenAI (0)
        • Security (0)
        • WebSocket (0)
        • JPA (1)
      • Algorithm (67)
        • DFS (6)
        • BFS (6)
        • Dynamic Programming (10)
        • Brute Force (4)
        • Binary Search (6)
        • 구현, 시뮬레이션 (15)
        • Stack (1)
        • Greedy (4)
        • Priority_Queue (2)
        • Back Tracking (3)
        • Geometry (2)
        • SCC (1)
        • 투포인터 (4)
        • 최대유량 (1)
        • 정렬 (1)
      • OS (0)
      • DevOps (15)
        • AWS (11)
        • Docker (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • hELLO· Designed By정상우.v4.10.0
Ls._.Rain
[BAEKJOON] 2234번 성곽
상단으로

티스토리툴바