본문 바로가기

알고리즘 관련/BOJ

2638 치즈

코드 길이가 길어질수록 실수할 확률이 높아지는건 불변의 진리같다... BFS 코드길이를 최대한 짧게 시도해 봐야할거 같다.

정답코드

더보기
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define MAX_SIZE 102
int N, M;
int field[MAX_SIZE][MAX_SIZE] = { {2, 2} };
int dirRow[] = { 0,0,1, -1 };
int dirCol[] = { 1, -1, 0, 0 };
void bfs(int row, int col)
{
	queue<pair<int, int>> q;
	for (int i = 0; i < MAX_SIZE; i++) {
		for (int j = 0; j < MAX_SIZE; j++) {
			if (field[i][j] == 2) {
				q.push({ i, j });
			}
		}
	}
	int nr, nc;
	while (!q.empty()){
		int row = q.front().first;
		int col = q.front().second;
		q.pop();
		for (int i = 0; i < 4; i++) {
			nr = row + dirRow[i];
			nc = col + dirCol[i];
			if (nr < 0 || nc < 0 ||
				nr > N || nc > M) {
				continue;
			}
			if (field[nr][nc] == 0) {
				q.push({ nr, nc });
				field[nr][nc] = 2;
			}
		}
	}
}
int CountDisappear(int row, int col, vector<pair<int, int>>& v)
{
	int cnt = 0;
	int nr, nc;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			if (field[i][j] == 1) {
				for (int k = 0; k < 4; k++) {
					nr = i + dirRow[k];
					nc = j + dirCol[k];
					if (field[nr][nc] == 2) {
						++cnt;
					}
				}
				if (cnt >= 2) {
					v.push_back({ i, j });
				}
				cnt = 0;
			}
		}
	}

	for (const auto& item : v) 
		field[item.first][item.second] = 2;

	return v.size();
}
int main()
{
	for (int i = 0; i < MAX_SIZE; i++) {
		for (int j = 0; j < MAX_SIZE; j++) {
			field[i][j] = 2;
		}
	}
	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			cin >> field[i][j];
		}
	}
	int time = 0;
	vector<pair<int, int>> v;
	while (1) {
		bfs(0, 0);
		if (CountDisappear(0, 0, v) == 0) {
			break;
		}
		++time;
		v.clear();
	}
	printf("%d\n", time);
	return 0;
}

'알고리즘 관련 > BOJ' 카테고리의 다른 글

14938 서강그라운드  (0) 2020.12.22
2751 수 정렬하기 2  (0) 2020.12.20
18119 단어 암기  (0) 2020.12.19
16953 A → B  (0) 2020.12.18
2096 내려가기  (0) 2020.12.18