알고리즘/시뮬레이션
[백준] 16918-봄버맨(C++)
잉읭응
2021. 7. 12. 21:16
반응형
문제링크: https://www.acmicpc.net/problem/16918
16918번: 봄버맨
첫째 줄에 R, C, N (1 ≤ R, C, N ≤ 200)이 주어진다. 둘째 줄부터 R개의 줄에 격자판의 초기 상태가 주어진다. 빈 칸은 '.'로, 폭탄은 'O'로 주어진다.
www.acmicpc.net
구현문제입니다.
접근방식
1. 단순구현으로 해결
3. 값이 짝수일때, 홀수일때로 나눠서 풀었다.
4. 짝수일때는 항상 모든 값이 O
홀수일때는 값이 변화하는 것을 시뮬레이션으로 구현
문제풀이
1. 짝수일때는 항상 모든 값이 O
홀수일때는 값이 변화하는 것을 시뮬레이션으로 구현
2. 홀수일때, copyed배열을 만들어서 변화하는 값을 저장해놓는 형식으로 구현
코드를 직접 확인하는게 더 빠를 것 같음
정답 코드
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
string arr[201];
int r, c, n;
int y_ar[4] = { -1,0,1,0 };
int x_ar[4] = { 0,1,0,-1 };
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> r >> c >> n;
for (int i = 0; i < r; i++)
cin >> arr[i];
if (n % 2 == 0) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++)
cout << 'O';
cout << "\n";
}
return 0;
}
string copyed[201];
for (int i = 0; i < r; i++)
copyed[i] = arr[i];
for (int i = 1; i < n; i += 2) {
for (int j = 0; j < r; j++)
copyed[j] = arr[j];
for (int j = 0; j < r; j++)
for (int k = 0; k < c; k++)
if (arr[j][k] == 'O') {
for (int u = 0; u < 4; u++) {
int ny = j + y_ar[u];
int nx = k + x_ar[u];
if (ny >= 0 && ny < r && nx >= 0 && nx < c)
copyed[ny][nx] = 'O';
}
}
for (int j = 0; j < r; j++)
for (int k = 0; k < c; k++) {
if (copyed[j][k] == 'O')
arr[j][k] = '.';
else {
arr[j][k] = 'O';
}
}
}
for (int i = 0; i < r; i++)
cout << arr[i] << "\n";
return 0;
}
반응형