문제접근
•
board에 폭탄이 설치가 안 되어 있는 상황이면 -1 , 설치되어 있으면 0 으로 시작
•
매초마다 처음부터 계속 순회를 하면서 폭탄이 증감연산을 통해서 1씩 증가시킴
→ 그 폭탄이 시간이 얼마나 지났는지를 알려줌
•
처음부터 끝까지 폭탄의 시간을 다 증가시키고 나면 3초짜리가 있는지를 다시 처음부터 확인을 하고 그 3초짜리 위치를 포함해서 상하좌우 폭탄을 -1로 초기화한다
놓쳤던 부분
•
처음 입력을 받을시에 폭탄이 없는 경우는 -1 폭탄이 입력된 경우는 1 로 초기화 해줘야함
처음엔 폭탄이 임의로 배치된 후에 1초동안은 아무것도 하지 않고 기존에 설치된 폭탄만 시간이 흘러가기 때문에 -1,0으로 초기화하는 것이 아니라 1초가 이미 지난 후인 -1,1로 초기화를 해줌
처음에 0과 1 로 초기화를 하여 폭탄을 설치한 뒤에 0초인 것과 폭탄이 설치되어 있지 않은 것의 구분이 되지 않아 잘못된 값 출력
•
3초가 된 폭탄들은 실제로는 동시에 터져야 하는건데 코드로는 위에서부터 순회하면서 하나씩 먼저 터뜨리게 된다. 그렇게 되면 위에서 먼저 터진 녀석들이 아래의 폭탄들에 먼저 영향을 주게 되어 원하는 결과가 나오지 않을 수 있다
01310
01310
00000
이와 같은 상황에서 우리가 원하는 결과는
00000
00000
00000
하지만 재귀적으로 생각하지 않으면
00000
01010
00000
이렇게 먼저 초기화가 된 후에 그 아래를 확인했을때 3이 아니라서 초기화가 일어나지 않는다
Plain Text
복사
코드
6524 KB
56 ms
#include <iostream>
#include <vector>
int r,c,n;
std::vector<std::vector<int> > board;
void input_setting()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
std::string str;
std::cin >> r >> c >> n;
board.resize(r, std::vector<int>(c));
for (int i = 0; i < r; i++)
{
std::cin >> str;
for (int j = 0; j < c; j++)
{
if (str[j] == '.')
board[i][j] = -1;
else
board[i][j] = 1;
}
}
}
void bomb(int i, int j)
{
board[i][j] = -1;
if (i + 1 < r)
{
if (board[i + 1][j] == 3)
bomb(i + 1, j);
else
board[i + 1][j] = -1;
}
if (j + 1 < c)
{
if (board[i][j + 1] == 3)
bomb(i, j + 1);
else
board[i][j + 1] = -1;
}
if (i - 1 >= 0)
{
if (board[i - 1][j] == 3)
bomb(i - 1, j);
else
board[i - 1][j] = -1;
}
if (j - 1 >= 0)
{
if (board[i][j - 1] == 3)
bomb(i, j - 1);
else
board[i][j - 1] = -1;
}
}
void solution()
{
for (int i = 1; i < n; i++)
{
for (int j = 0; j < r; j++)
for (int k = 0; k < c; k++)
board[j][k]++;
if (i >= 2)
for (int j = 0; j < r; j++)
for (int k = 0; k < c; k++)
if (board[j][k] == 3)
bomb(j, k);
}
}
void print()
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (board[i][j] == -1)
std::cout << ".";
else
std::cout << "O";
}
std::cout << "\n";
}
}
int main(void)
{
input_setting();
input();
solution();
print();
return (0);
}
C++
복사