어흥

[백준 10711] 모래성 (C++) 본문

알고리즘/백준

[백준 10711] 모래성 (C++)

라이언납시오 2020. 3. 5. 21:05
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/10711

 

10711번: 모래성

문제 명우와 친구들은 여름방학을 맞이하여 해변가에 놀러가기로 했다. 이번에 여행을 떠난 해수욕장의 이름은 ALPS(Awsome Land & Poor Sea)이다. 해변가에서 수영복을 입은 미녀들에게 관심이 많은 원철이와는 달리 명우는 해변가의 모래에 더 관심이 많다. 해변가의 모래는 무한한 것들을 만들 수 있는 가능성을 내포하고 있다. 또한 이렇게 만들어진 작품이 파도에 의해 사라지는 모습은, 마치 자신이 가장 빛날 수 있는 시간을 알고 스스로 아름답게

www.acmicpc.net

1. 주의할 점: 

- 배열의 크기가 커서 check/visit 배열을 매번 초기화해주면서 하기엔 TLE가 발생한다

- result++를 어느부분에서 할 것인지 잘 인지한다

 

2. 구현

- arr배열을 int형 배열로 받는다

- 기존에 '.'으로 입력받은 원소는 0으로 대체 + queue에 추가한다

- 매번 파도를 가지고 있지 않고 파도가 영향을 끼칠수 있는 모래성을 1씩 깍고 버린다

  -> 모래성의 강도가 0이되면 queue에 추가한다

-새로 queue에 추가된 원소가 없을 경우 종료한다

 

#include <iostream>
#include <queue>
using namespace std;
int arr[1000][1000];
int row, col, result = 0;
struct info {
	int x, y;
};
info tmp;
int dx[8] = { 0,1,1,1,0,-1,-1,-1 };
int dy[8] = { -1,-1,0,1,1,1,0,-1 };
queue<info> q;

void bfs() {
	while (1) {
		int len = q.size();
		for (int i = 0; i < len; i++) {
			int cx = q.front().x;
			int cy = q.front().y;
			q.pop();
			for (int j = 0; j < 8; j++) {
				int nx = cx + dx[j];
				int ny = cy + dy[j];
				if (nx >= 0 && ny >= 0 && nx < col && ny < row && arr[ny][nx]>0) {
					arr[ny][nx] -= 1;
					if (arr[ny][nx] == 0) {
						tmp.x = nx;
						tmp.y = ny;
						q.push(tmp);
					}
				}
			}
		}
		if (q.empty()) break;
		result++;
	}
}

int main() {
	cin >> row >> col;
	char c;
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++) {		
			cin >> c;
			if (c == '.') {
				tmp.x = j;
				tmp.y = i;
				q.push(tmp);
				arr[i][j] = 0;
			}
			else
				arr[i][j] = c - '0';
		}
	bfs();
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 5214] 환승 (C++)  (0) 2020.03.06
[백준 4179] 불! (C++)  (0) 2020.03.05
[백준 12100] 2048 (Easy) (C++)  (0) 2020.03.05
[백준 14500] 테트로미노 (C++)  (0) 2020.03.05
[백준 16953] A → B (C++)  (0) 2020.03.04
Comments