2909: 【例65.2】 清除地雷

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

在一张 $n × m$ 的地图上,有一些地雷,用 $1$ 表示,其余没有地雷的地方用 $0$ 表示;如果某个地雷被引爆了,那么它的波及范围会炸掉 周围八个位置的土地和该地雷所在位置的土地,如果在它的八个位置上也有地雷,那么这些地雷将会连锁反应,继续引爆,爆炸后的土地用 $2$ 表示。请你编写程序,输出引爆某个地雷后地图的模样。

输入

输入共计 $n + 2$行:
第一行包含两个整数:$n$($1≤n≤100$),$m$($1≤m≤100$),表示地图的大小为 $n×m$。
第 $2$ 到 $n+1$ 行,每行包含 $m$ 个字符,表示地图的样貌。
第 $n+2$ 行包含两个整数:$x$($1≤x≤n$),$y$($1≤y≤m$),表示地图上指定开始(引爆)的坐标。如果指定的坐标是土地,也就不需要引爆任何地雷。

输出

输出 $n$ 行,每行包含 $m$ 个数,表示爆炸后的地图模样。

样例输入 复制

5 5
10100
01000
00000
00000
00001
1 1

样例输出 复制

22220
22220
22200
00000
00001

提示

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
char boom[105][105];
void f(int x,int y){
    boom[x][y]='2';
    for(int i=0;i<8;i++){
        int nx=dx[i]+x,ny=dy[i]+y;
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
            if(boom[nx][ny]=='1') f(nx,ny);
            boom[nx][ny]='2';
        }
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++) cin>>boom[i][j];
    cin>>x>>y;
    if(boom[x][y]=='1') f(x,y);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++) cout<<boom[i][j];
            cout<<endl;
    }
    return 0;
}