求助,玄关
  • 板块灌水区
  • 楼主xcms
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/1/17 20:19
  • 上次更新2024/1/17 22:31:49
查看原帖
求助,玄关
1245940
xcms楼主2024/1/17 20:19

题目描述

Description

在一个 m×nm×n 的地图里面,有水和空地。水用'.'表示,空地用'*'表示。有些位置水与上下左右 相邻的水连成一片的,叫做水洼,'.'的数量表示水洼的大小。现在我们希望把空地变成水,对于给出的地图,输出把每块空地变成水后(每次只改变这一个位置,其他位置保持地图原来的状态),连通的整个水洼的大小。

Input Format

第一行: 2 个数 n,mn,m ,中间用空格分隔,表示地图的大小(1≤m,n≤1000)( 1≤m,n≤1000 )。 后面 nn 行:每行 mm 个字符,对应地图中的位置是水还是空地。

Output Format

对应原地图中的空地,输出将该位置改为水后,所处水洼的大小。结果 Mod10Mod 10 。

输入数据 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;
}

一个广搜的代码,超时了,希望大佬们能帮忙改一下。

2024/1/17 20:19
加载中...