Search
Duplicate
📗

봄버맨

주차
23
문제번호
16918
언어
티어
실버
유형
구현
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

board에 폭탄이 설치가 안 되어 있는 상황이면 -1 , 설치되어 있으면 0 으로 시작
매초마다 처음부터 계속 순회를 하면서 폭탄이 증감연산을 통해서 1씩 증가시킴
→ 그 폭탄이 시간이 얼마나 지났는지를 알려줌
처음부터 끝까지 폭탄의 시간을 다 증가시키고 나면 3초짜리가 있는지를 다시 처음부터 확인을 하고 그 3초짜리 위치를 포함해서 상하좌우 폭탄을 -1로 초기화한다

놓쳤던 부분

처음 입력을 받을시에 폭탄이 없는 경우는 -1 폭탄이 입력된 경우는 1 로 초기화 해줘야함
처음엔 폭탄이 임의로 배치된 후에 1초동안은 아무것도 하지 않고 기존에 설치된 폭탄만 시간이 흘러가기 때문에 -1,0으로 초기화하는 것이 아니라 1초가 이미 지난 후인 -1,1로 초기화를 해줌
처음에 01 로 초기화를 하여 폭탄을 설치한 뒤에 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++
복사