引入 曼哈顿距离:两个点在标坐标系上的绝对轴距总和 即 | r1-r2 | + | c1-c2 |
题意:在输入中, # 代表围墙 · 代表空地 数字到点的曼哈顿距离小于这个数字都要被炸成空地
题目描述
縦 RR 行横 CC 列の盤面があります。上から ii 行目、左から jj 列目のマスを (i,j)(i,j) と表します。
(i,j)(i,j) の現在の状態が文字 B_{i,j}Bi,j として与えられます。 .
は空きマス、#
は壁があるマスを表し、 1
, 2
,\dots…, 9
はそれぞれ威力 1,2,\dots,91,2,…,9 の爆弾があるマスを表します。
次の瞬間に、全ての爆弾が同時に爆発します。 爆弾が爆発すると、爆弾があるマスからのマンハッタン距離がその爆弾の威力以下であるような全てのマス(その爆弾があるマス自体を含む)が空きマスに変わります。 ここで、(r_1,c_1)(r1,c1) から (r_2,c_2)(r2,c2) までのマンハッタン距離は |r_1-r_2|+|c_1-c_2|∣r1−r2∣+∣c1−c2∣ です。
爆発後の盤面を出力してください。
题意翻译
在字符与数字的矩阵中,数字(C[i][j])代表炸弹的范围,其能炸到的范围内的点与数字之间的曼哈顿距离<=C[i][j],即| r1-r2 | + | c1-c2 | < = C [ i ] [ j ]
图示 其中 · 代表空地 # 代表墙壁 这里空地表示炸弹能炸到的范围
输入输出样例
Input #1
4 4 .1.# ###. .#2. #.##
Output #1
...# #... .... #...
Input #2
2 5 ..#.# ###.#
Output #2
..#.# ###.#
Input #3
2 3 11# ###
Output #3
... ..#
Input #4
4 6 #.#3#. ###.#. ##.### #1..#.
Output #4
...... #..... #....# ....#.
数据范围
1<=n,c=20(非常水,放心大胆暴力)
简约而不简单的暴力ac代码
#include<bits/stdc++.h>
using namespace std;
char C[25][25];
int r,c;
int main(){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>C[i][j];
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(C[i][j]>='1'&&C[i][j]<='9'){//如果该点为炸弹
for(int k=1;k<=r;k++){
for(int t=1;t<=c;t++){
int x=C[i][j]-'0';//被炸成空地的点与数字之间曼哈顿距离最大值 强制转换
if(abs(i-k)+abs(j-t)<=x&&C[k][t]=='#') C[k][t]='.';
//代码核心 横轴与纵轴的距离和 后半段条件为我们省略了本就是空地的赋
//值 也算小小优化
}
}
}
}
}
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(C[i][j]>='1'&&C[i][j]<='9') cout<<'.';//炸弹位置本身变成空地
else cout<<C[i][j];
}
cout<<endl;
}
return 0;//好习惯
}
当然还有更优的搜索解法,由于本蒟蒻太蒻,不多赘述