티스토리 뷰

Problem Solving/BOJ

[BOJ 10711] 모래성 C++

유자애옹 2021. 7. 26. 23:15

 

 

10711번: 모래성

첫째 줄에는 모래성의 가로세로 격자 크기 H, W가 주어진다. (1 ≤ H, W ≤ 1,000) 그 다음 H줄에 걸쳐 W개의 문자로 모래성의 상태를 나타내는 문자가 들어온다. 각 문자는 1~9 사이의 숫자, 또는 '.' 이

www.acmicpc.net

 

 

문제풀이

 

처음 시도했을 때는 모래성을 모두 queue에 넣고 8방향을 모두 살펴 무너지는지 확인 후 무너지지 않는 모래성을 queue에 다시 넣어줬다.

 

결과는 시간초과..

 

더보기
#include <iostream>
#include <queue>
#define MAX 1001
using namespace std;

int h, w;
int map[MAX][MAX];
bool visited[MAX][MAX];

int dx[] = { -1, 1, 0, 0, -1, -1, 1, 1 };
int dy[] = { 0, 0, -1, 1, -1, 1, -1, 1 };

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> h >> w;

	queue<pair<int, int>> q;
	string tmp;

	for (int i = 0; i < h; i++) {
		cin >> tmp;
		for (int j = 0; j < w; j++) {
			map[i][j] = tmp[j] != '.' ? tmp[j] - '0' : 0;
			if (map[i][j] != 0) {
				q.push({ i, j });
				visited[i][j] = true;
			}
		}
	}

	int answer = 0;

	while (!q.empty()) {
		int size = q.size();
		for (int i = 0; i < size; i++) {
			int x = q.front().first;
			int y = q.front().second;
			q.pop();

			int cnt = 0;
			for (int j = 0; j < 8; j++) {
				int nx = x + dx[j];
				int ny = y + dy[j];

				if (nx < 0 || ny < 0 || nx >= h || ny >= w) continue;
				if (visited[nx][ny]) continue;

				if (map[nx][ny] == 0)
					cnt++;
			}

			if (cnt < map[x][y])
				q.push({ x, y });
			else
				map[x][y] = 0;
		}

		if (q.size() == size)
			break;
		
		answer++;
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w; j++) {
				if (map[i][j] == 0)
					visited[i][j] = false;
			}
		}
	}
	cout << answer;

	return 0;
}

 

 

그래서 무너지지 않는 모래성이 아니라 무너지는 모래성을 queue에 넣어줬다.

 

모래성의 튼튼함은 1부터 9사이의 숫자로 표현되는데 튼튼함이 9이면 절대 무너지지 않는다.

따라서 1부터 8까지의 튼튼함을 가지는 모래성들은 queue에 넣는다.

 

그 모래성들의 8방향을 모두 살펴보고 근처에 무너지는 모래성이 있다면 queue에 넣어준다.

이 과정을 무너지는 모래성이 없을 때까지 반복해준다.

 

 

C++ 코드

 

 

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 11265] 끝나지 않는 파티 C++  (0) 2021.07.27
[BOJ 10026] 적록색약 C++  (0) 2021.07.26
[BOJ 2473] 세 용액 C++  (2) 2021.07.22
[BOJ 2467] 용액 C++  (0) 2021.07.22
[BOJ 2470] 두 용액 C++  (0) 2021.07.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함