求助刚刚unr比赛第三题
  • 板块灌水区
  • 楼主_xEr_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/8/5 13:11
  • 上次更新2023/11/3 05:46:39
查看原帖
求助刚刚unr比赛第三题
672815
_xEr_楼主2023/8/5 13:11

题目

我的主题思路是第一个dfs分出水洼块,第二个dfs把每块水洼的哈希值设为所在大水洼的总水洼数。times用来区分不同的大水洼。

然后遍历,具体见代码 48~63 行

最后特判一下总体水洼的情况(最后一个for)

代码:

#include<iostream>
#include<cstring>
using namespace std;
long long n;
bool a[3000][3000];
int dh[3000][3000],times[3000][3000],cnt;
int ans[9000000],sum;
int ans2[9000000];
void dfs(int x,int y){
	if(x<1||x>n||y<1||y>n||dh[x][y]||!a[x][y])return;
	sum++;
	dh[x][y]=1;
	dfs(x+1,y);
	dfs(x-1,y);
	dfs(x,y+1);
	dfs(x,y-1);
} 
void Dfs(int x,int y){
//	cout<<" - "<<x<<' '<<y<<' '<<dh[x][y]<<endl;
	if(x<1||x>n||y<1||y>n||dh[x][y]==0||dh[x][y]==sum)return;
//	cout<<x<<' '<<y<<endl;
	dh[x][y]=sum;
	times[x][y]=cnt;
	Dfs(x+1,y);
	Dfs(x-1,y);
	Dfs(x,y+1);
	Dfs(x,y-1);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]&&!dh[i][j]){
			//	memset(dh,0,sizeof dh);
				sum=0;
				dfs(i,j);
				cnt++;
				Dfs(i,j);
			//	cout<<endl;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(dh[i][j]==0){
				if(times[i-1][j]!=times[i+1][j])
					if(i>1&&i<n)
						ans[dh[i-1][j]+dh[i+1][j]+1]++;
				if(times[i][j-1]!=times[i][j+1])
					if(j>1&&j<n)
						ans[dh[i][j-1]+dh[i][j+1]+1]++;
			}else{
				ans2[dh[i][j]]=dh[i][j];
			}
		//	cout<<dh[i][j]<<' ';
		}
	//	cout<<endl;
	}
	for(int i=8000000;i;i--){
		if(ans[i]>0){
			cout<<i<<' '<<ans[i];
			return 0;
		}
	}
	for(int i=8000000;i;i--){
		if(ans2[i]>0){
			cout<<i<<' '<<ans2[i];
			return 0;
		}
	}
}
2023/8/5 13:11
加载中...