[ABC295B] Bombs
题目编号 AT_abc295_b
题目来源 AtCoder
评测方式 RemoteJudge
题面翻译
题目描述
有一个
R
R
R 行
C
C
C 列的盘面,点
(
i
,
j
)
(i, j)
(i,j) 表示第
i
i
i 行第
j
j
j 列的格子。上面有三种状态,.
代表空地,#
代表一堵墙,1
, 2
, 3
… 9
代表炸弹。上面的 1
~ 9
代表炸弹的威力值。
下面,所有的炸弹同时爆炸,所有曼哈顿距离小于等于每个点上的威力值的墙将变成空地。
注意:如果该点在爆炸范围内,且该点是炸弹,则不会变成空地。爆炸后,该炸弹本身会变成空地。
你需要输出爆炸后的盘面。
输入格式
第一行,两个数字,代表 R R R 和 C C C。
接下来 R R R 行,代表盘面的每一行。
输出格式
R R R 行,爆炸后的盘面。
数据规模与约定
-
1 ≤ R , C ≤ 20 1 \le R, C \le 20 1≤R,C≤20
-
R , C R, C R,C 均为整数
-
每个地方只能是
.
,#
,1
,2
,3
…9
的字符
题目描述
縦 $ R $ 行横 $ C $ 列の盤面があります。上から $ i $ 行目、左から $ j $ 列目のマスを $ (i,j) $ と表します。
$ (i,j) $ の現在の状態が文字 $ B_{i,j} $ として与えられます。 .
は空きマス、#
は壁があるマスを表し、 1
, 2
,$ \dots $, 9
はそれぞれ威力 $ 1,2,\dots,9 $ の爆弾があるマスを表します。
次の瞬間に、全ての爆弾が同時に爆発します。 爆弾が爆発すると、爆弾があるマスからのマンハッタン距離がその爆弾の威力以下であるような全てのマス(その爆弾があるマス自体を含む)が空きマスに変わります。 ここで、$ (r_1,c_1) $ から $ (r_2,c_2) $ までのマンハッタン距離は $ |r_1-r_2|+|c_1-c_2| $ です。
爆発後の盤面を出力してください。
输入格式
入力は以下の形式で標準入力から与えられる。
$ R $ $ C $ $ B_{1,1}B_{1,2}\dots\ B_{1,C} $ $ \vdots $ $ B_{R,1}B_{R,2}\dots\ B_{R,C} $
输出格式
爆発後の盤面を $ R $ 行で出力せよ。盤面の表し方は入力と同じ形式を用いること ($ R $ と $ C $ を出力する必要はない)。
样例 #1
样例输入 #1
4 4
.1.#
###.
.#2.
#.##
样例输出 #1
...#
#...
....
#...
样例 #2
样例输入 #2
2 5
..#.#
###.#
样例输出 #2
..#.#
###.#
样例 #3
样例输入 #3
2 3
11#
###
样例输出 #3
...
..#
样例 #4
样例输入 #4
4 6
#.#3#.
###.#.
##.###
#1..#.
样例输出 #4
......
#.....
#....#
....#.
提示
制約
- $ 1\leq\ R,C\ \leq\ 20 $
- $ R,C $ は整数
- $ B_{i,j} $ は
.
,#
,1
,2
,$ \dots $,9
のいずれかである
Sample Explanation 1
![爆弾の効果範囲を表す図](https://img.atcoder.jp/abc295/4816cc7b706b4a095bb9a5d07c614790.jpg) - $ (1,2) $ にある爆弾の爆発によって、上図の青いマスと紫のマスが空きマスに変わります。 - $ (3,3) $ にある爆弾の爆発によって、上図の赤いマスと紫のマスが空きマスに変わります。 この例のように、爆弾が効果を及ぼす範囲に被りがあることもあります。
Sample Explanation 2
爆弾が $ 1 $ つもないこともあります。
#include<bits/stdc++.h>
using namespace std;
vector<tuple<int,int,int>>bomb;
bool mhd(int a,int b){
for(int i=0;i<bomb.size();++i){
int p=get<0>(bomb[i]);
int q=abs(a-get<1>(bomb[i]))+abs(b-get<2>(bomb[i]));
if(p>=q)return true;
}
return false;
}
int main(){
ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
int r,c;cin>>r>>c;char arr[r][c];
for(int i=0;i<r;++i)for(int j=0;j<c;++j){
cin>>arr[i][j];
if(isdigit(arr[i][j])){
bomb.push_back(make_tuple(arr[i][j]-'0',i,j));
arr[i][j]='.';
}
}
for(int i=0;i<r;++i)for(int j=0;j<c;++j){
if(arr[i][j]=='.')continue;
else if(mhd(i,j))arr[i][j]='.';
}
for(int i=0;i<r;++i){
for(int j=0;j<c;++j)cout<<arr[i][j];
cout<<endl;
}
return 0;
}