在一个 m×n 的地图里面,有水和空地。水用'.'表示,空地用'*'表示。有些位置水与上下左右 相邻的水连成一片的,叫做水洼,'.'的数量表示水洼的大小。现在我们希望把空地变成水,对于给出的地图,输出把每块空地变成水后(每次只改变这一个位置,其他位置保持地图原来的状态),连通的整个水洼的大小。
第一行: 2 个数 n,m ,中间用空格分隔,表示地图的大小(1≤m,n≤1000)。 后面 n 行:每行 m 个字符,对应地图中的位置是水还是空地。
对应原地图中的空地,输出将该位置改为水后,所处水洼的大小。结果 Mod10 。
输入数据 1
4 5
**..*
..***
.*.*.
*.*.*
输出数据 1
46..3
..732
.6.4.
5.4.3
我的代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e3+1;
struct Node{
int x,y;
};
int n,m;
char map[N][N];
bool vis[N][N];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
int bfs(int x,int y){
memset(vis,0,sizeof vis);
queue <Node> q;
q.push({x,y});
vis[x][y]=1;
int sum=0;
while(!q.empty()){
Node h=q.front();
q.pop();
x=h.x,y=h.y;
sum++;
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&map[tx][ty]=='.'){
q.push({tx,ty});
vis[tx][ty]=1;
}
}
}
return sum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]=='*')cout<<bfs(i,j)%10;
else cout<<map[i][j];
}
cout<<"\n";
}
return 0;
}
一个广搜的代码,超时了,希望大佬们能帮忙改一下。