※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 7873번 문제인 Decision이다.
문제는 아래 링크를 확인하자.

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

 

주어진 각 격자의 칸은 두 대각선으로 잘라서 보았을 때 상하좌우의 삼각형모양의 네 칸으로 나눌 수 있다. 주어진 입력을 이와 같이 나눈 격자로 읽어 그래프로 모델링하면 주어진 문제는 그래프에서의 connected component의 개수를 세는 문제로 어렵지 않게 변환하여 문제를 해결하자.

 

그래프로 모델링할 때, 원래 격자에서의 인접한 칸 사이의 연결관계와 각 칸 내부에 생성된 삼각형들 사이의 연결관계를 모두 고려해야 함에 유의하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <queue>
using namespace std;

int R, C;
bool board[1000][1000][4];
int dr[4] = {0,0,1,-1};
int dc[4] = {1,-1,0,0};
queue<int> que;

void bfs(int sR, int sC, int sD) {
	board[sR][sC][sD] = 0;
	que.push(sR * 1000000 + sC * 1000 + sD);
	while (!que.empty()) {
		int r = que.front() / 1000000, c = que.front() % 1000000 / 1000, d = que.front() % 1000; que.pop();
		for (int dd = 0; dd < 4; dd++) {
			if ((dd ^ d) & 2) {
				if (board[r][c][dd]) {
					board[r][c][dd] = 0;
					que.push(r * 1000000 + c * 1000 + dd);
				}
			}
		}
		int rr = r + dr[d], cc = c + dc[d], dd = d ^ 1;
		if (rr > -1 && rr < R && cc > -1 && cc < C && board[rr][cc][dd]) {
			board[rr][cc][dd] = 0;
			que.push(rr * 1000000 + cc * 1000 + dd);
		}
	}
}

void solve() {
	cin >> R >> C;
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			char x; cin >> x;
			if (x == 'A');
			else if (x == 'B') board[r][c][2] = 1, board[r][c][1] = 1;
			else if (x == 'C') board[r][c][3] = 1, board[r][c][1] = 1;
			else if (x == 'D') board[r][c][3] = 1, board[r][c][0] = 1;
			else if (x == 'E') board[r][c][2] = 1, board[r][c][0] = 1;
			else board[r][c][3] = 1, board[r][c][2] = 1, board[r][c][1] = 1, board[r][c][0] = 1;
		}
	}
	int ans = 0;
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			for (int i = 0; i < 4; i++) {
				if (board[r][c][i]) {
					bfs(r, c, i);
					ans++;
					break;
				}
			}
		}
	}
	cout << ans << '\n';
}

int T;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> T;
	while (T--) solve();
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 2115 // C++] 갤러리  (0) 2024.08.08
[BOJ 30630 // C++] 직각삼각형의 동생은?  (0) 2024.08.07
[BOJ 12181 // C++] Googlander (Large)  (0) 2024.08.05
[BOJ 2128 // C++] 마지막 조별 시합  (0) 2024.08.04
[BOJ 20914 // C++] QWERTY 자판  (0) 2024.08.03

+ Recent posts