[アルゴリズム解解析]BOJ 16918春スーパーマン
今日の質問はBOJ 16918春スーパーマンです!
春スーパーマンの大きさはR×C人の矩形の格子板に住んでいます.グリッドの各格子は空か爆弾が入っています.
爆弾のある部屋は3秒後に爆発し、爆弾が爆発した後、爆弾のある部屋は空室に破壊され、隣接する4部屋も一緒に破壊された.すなわち,爆弾が存在する部屋が(i,j),(i+1,j),(i−1,j),(i,j+1),(i,j−1)であれば,(i,j−1)も共に破壊される.爆弾が爆発すると、隣の部屋に爆弾があり、隣の爆弾は爆発せずに破壊されます.そのため、連鎖反応はなかった.
春にバーマンは爆弾に免疫力があり、グリルの上のすべての格子を自由に移動することができる.春のバーマンは以下のように表現されています.の最初の春、バーマンはいくつかの車両に爆弾を設置した.すべての爆弾が取り付けられた時間は同じです. 次の一秒で、春バーマンは何もしません. から1秒以内に、爆弾が設置されていないすべての部屋に爆弾を設置します.つまり、すべての車両に爆弾があるということです.爆弾はすべて同時に取り付けられたと仮定します. 1秒後、3秒前に取り付けられた爆弾はすべて爆発した. 3と4を繰り返します.
爆弾の初期状態を設定すると、N秒後のグリッド状態を求めようとする. たとえば、初期状態が次の場合です.
[入力]
第1行は、R、C、N(1≦R、C、N≦200)を与える.2行目から、R行はメッシュプレートの初期状態を与える.スペースは「.」ロ、爆弾は「O」で与えられる.
[出力]
共R行、N秒後のメッシュボード状態を出力します.
これはグラフ探索問題で探した問題であるが,解の際にdfsがなく,bfsも簡単に解くことができることが分かった.シミュレーションみたいな感じで、、、、?
1秒から、毎秒規則に従ってグリッドプレートの状態を変更すればよい.爆弾は設置3秒後に爆発したため、各爆弾の設置時間を管理するために2次元配列
爆弾を1つ取り付けるたびに、その時点を記録し、1つの時点を変更するたびに、3秒後に爆弾を爆発させ、
BOJ 16918春スーパーマン
春スーパーマンの大きさはR×C人の矩形の格子板に住んでいます.グリッドの各格子は空か爆弾が入っています.
爆弾のある部屋は3秒後に爆発し、爆弾が爆発した後、爆弾のある部屋は空室に破壊され、隣接する4部屋も一緒に破壊された.すなわち,爆弾が存在する部屋が(i,j),(i+1,j),(i−1,j),(i,j+1),(i,j−1)であれば,(i,j−1)も共に破壊される.爆弾が爆発すると、隣の部屋に爆弾があり、隣の爆弾は爆発せずに破壊されます.そのため、連鎖反応はなかった.
春にバーマンは爆弾に免疫力があり、グリルの上のすべての格子を自由に移動することができる.春のバーマンは以下のように表現されています.
爆弾の初期状態を設定すると、N秒後のグリッド状態を求めようとする.
...
.O.
...
一秒たっても何も起こらないので、このように言えます.あと1秒でメッシュボードの状態は次のようになります.OOO
OOO
OOO
1秒後、真ん中の爆弾が爆発し、真ん中の格子と隣の格子がスペースになった.O.O
...
O.O
にゅうしゅつりょく
[入力]
第1行は、R、C、N(1≦R、C、N≦200)を与える.2行目から、R行はメッシュプレートの初期状態を与える.スペースは「.」ロ、爆弾は「O」で与えられる.
[出力]
共R行、N秒後のメッシュボード状態を出力します.
私の答え
これはグラフ探索問題で探した問題であるが,解の際にdfsがなく,bfsも簡単に解くことができることが分かった.シミュレーションみたいな感じで、、、、?
1秒から、毎秒規則に従ってグリッドプレートの状態を変更すればよい.爆弾は設置3秒後に爆発したため、各爆弾の設置時間を管理するために2次元配列
installTime
が確立された.爆弾を1つ取り付けるたびに、その時点を記録し、1つの時点を変更するたびに、3秒後に爆弾を爆発させ、
installTime
の値を初期化します.コード#コード#
#include <iostream>
#include <vector>
using namespace std;
vector<vector<char>> matrix;
vector<vector<int>> installTime;
int dy[5] = {0,-1,0,1,0};
int dx[5] = {0,0,1,0,-1};
void installBomb(int R, int C, int sec){
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j){
if (matrix[i][j]=='.') {
matrix[i][j] = 'O';
installTime[i][j] = sec;
}
}
}
}
void removeBomb(int R, int C, vector<pair<int, int>> points){
for (int i = 0; i < points.size(); ++i) {
for (int k = 0; k < 5; ++k) {
int row = points[i].first+dy[k], col = points[i].second+dx[k];
if (row<0||row>=R||col<0||col>=C) continue;
matrix[row][col] = '.';
installTime[row][col] = -1;
}
}
}
void moveMan(int R, int C, int N){
int sec = 1;
while (sec<N){
sec++;
installBomb(R, C, sec);
if (sec==N) break;
sec++;
vector<pair<int, int>> remove_points;
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j){
if (sec-installTime[i][j]==3){
remove_points.push_back({i,j});
}
}
}
removeBomb(R, C, remove_points);
}
}
int main() {
int R, C, N;
cin>>R>>C>>N;
matrix.assign(R, vector<char>(C, ' '));
installTime.assign(R, vector<int>(C, -1));
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j) {
cin>>matrix[i][j];
if (matrix[i][j] =='O') installTime[i][j] = 0;
}
}
moveMan(R, C, N);
for (int i = 0; i < R; ++i) {
for (int j = 0; j < C; ++j){
cout<<matrix[i][j];
}
cout<<'\n';
}
return 0;
}
Reference
この問題について([アルゴリズム解解析]BOJ 16918春スーパーマン), 我々は、より多くの情報をここで見つけました https://velog.io/@nnnyeong/알고리즘-풀이-분석-BOJ-16918-봄버맨テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol