[C++] 백준 16918번: 봄버맨

be_clever·2022년 2월 18일
0

Baekjoon Online Judge

목록 보기
85/172

문제 링크

16918번: 봄버맨

문제 요약

격자 상에 초기에 폭탄이 놓여 있다. 폭탄은 폭발하면 현재 칸과 상하좌우의 칸을 폭파시킨다. 폭파시키는 칸에 폭탄이 있다면 해당 폭탄은 연쇄적으로 폭발하지 않고 사라진다. 시작 후 1초 동안은 봄버맨은 아무것도 하지 않는다. 그리고 다음의 절차를 반복한다.
1. 다음 1초 동안 폭탄이 설치되어 있지 않은 모든 칸에 폭탄을 설치한다. 즉, 모든 칸은 폭탄을 가지고 있게 된다. 폭탄은 모두 동시에 설치했다고 가정한다.
2. 1초가 지난 후에 3초 전에 설치된 폭탄이 모두 폭발한다.

접근 방법

배열을 두 개 선언해주고 반복적으로 시뮬레이션을 해주면 됩니다.

N이 짝수인 경우에는 모든 칸이 'O'으로 차 있습니다. 따라서 짝수인 경우에는 그렇게 출력을 해주면 끝이 납니다.

1초가 경과한 시점에는 봄버맨은 아무것도 하지 않습니다. 이 경우에도 초기에 입력 받은 상태를 그대로 출력해주면 됩니다.

이제 3, 5, 7, 9초처럼 1을 제외한 홀수인 경우에는 2씩 증가시키면서 다음을 반복해서 시뮬레이션 해주면 됩니다.

  1. 현재 폭탄이 있는 칸과 해당 칸의 상하좌우를 모두 체크해준다.
  2. 체크가 되지 않은 칸에 폭탄을 다시 설치해준다.

코드

#include <bits/stdc++.h>

using namespace std;

const int MAX = 201;
int r, c, n, dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
char b[MAX][MAX];
bool check[MAX][MAX];

void explosion(int row, int col)
{
	check[row][col] = true;

	for (int i = 0; i < 4; i++)
	{
		int nrow = row + dir[i][0], ncol = col + dir[i][1];
		if (nrow >= 1 && nrow <= r && ncol >= 1 && ncol <= c)
			check[nrow][ncol] = true;
	}
}

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

	cin >> r >> c >> n;

	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			cin >> b[i][j];

	if (n % 2 == 0)
	{
		for (int i = 1; i <= r; i++)
		{
			for (int j = 1; j <= c; j++)
				cout << 'O';
			cout << '\n';
		}

		return 0;
	}

	for (int i = 3; i <= n; i += 2)
	{
		memset(check, false, sizeof(check));
		
		for (int j = 1; j <= r; j++)
			for (int k = 1; k <= c; k++)
				if (b[j][k] == 'O')
					explosion(j, k);

		for (int j = 1; j <= r; j++)
			for (int k = 1; k <= c; k++)
				b[j][k] = (check[j][k] ? '.' : 'O');
	}

	for (int i = 1; i <= r; i++)
	{
		for (int j = 1; j <= c; j++)
			cout << b[i][j];
		cout << '\n';
	}

	return 0;
}
profile
똑똑해지고 싶어요

0개의 댓글