教你一招获得3关注(待会删)
  • 板块灌水区
  • 楼主_mmx_
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/6/9 20:42
  • 上次更新2024/6/9 21:00:37
查看原帖
教你一招获得3关注(待会删)
1215303
_mmx_楼主2024/6/9 20:42

帮可怜的_mmx_解了这道题即可。

有一个 H×W 的网格 ,每个单元格有两种颜色:红色或绿色。

让 (i,j) 表示从顶部开始第 i 行和从左侧开始第 j 列的单元格。

单元格 (i,j) 的颜色由字符 S[i][j]
表示,其中 S[i][j]='.' 表示单元格 (i,j) 为红色,S[i][j]='#' 表示单元格 (i,j) 为绿色。

网格中的绿色连通分量的数量是图中的连通分量的数量,顶点集为绿色单元格,边集为连接两个相邻绿色单元格的边

考虑选择一个红色单元格并将其重新绘制为绿色,可以将最多的绿色连通区域合并在一起.
问一次最多可以合并几个绿色连通区域,合并后的连通区域最多是多少?


样例:


输入:

3 4
#.#.
.#.#
..##

输出:

3 6


以下是我狗屁不通的代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int MX=1e3+10;
const int mod=1e9+7;
char s[MX][MX];
int mp[MX][MX];
int vis[MX][MX];
int n,m;
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
void dfs(int x,int y,int num){
	mp[x][y]=num;
	for(int i=0;i<4;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m && s[nx][ny]=='#' && !mp[nx][ny]){
			mp[nx][ny]=num;
			dfs(nx,ny,num);
		}
	}
	return ;
}
void search(int x,int y){
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		if(nx>=1 && nx<=n && ny>=1 && ny<=m && s[nx][ny]=='#' && !vis[nx][ny]){
			vis[nx][ny]=1;
			search(nx,ny);
		}
	}
	return ;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	int mx_size=-1,mx_num=0;
	int ex,ey;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin >> s[i][j];
		}
	}
	int cnt=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]=='#' && !mp[i][j]){
				cnt++;
				dfs(i,j,cnt);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]!='.'){
				continue;
			}
			set<int> st;
			for(int k=0;k<4;k++){
				int nx=i+dx[k],ny=j+dy[k];
				if(nx>=1 && nx<=n && ny>=1 && ny<=m && mp[nx][ny]!=0){
					st.insert(mp[nx][ny]);
				}
			}
			if((int)(st.size())>mx_size){
				ex=i,ey=j,mx_size=st.size();
			}
		}
	}
	s[ex][ey]='#';
	search(ex,ey);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(vis[i][j]==1){
				mx_num++;
			}
		}
	}
	cout << mx_size << " " << mx_num;
	return 0;
}
2024/6/9 20:42
加载中...