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$($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; }