WA四个点求助
查看原帖
WA四个点求助
644112
Sinktank楼主2024/4/29 21:55

https://atcoder.jp/contests/abc351/submissions/52948329

代码见下。具体思路是dfs跑连通块,因为两个连通块可能有相交的区域,,而这些相交区域只能是磁场区域(磁铁旁的4个格子),所以这里记录了每次跑连通块遇到的磁场区域,跑完一次单独把这些格子vis设为0。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
string s[1010];
bool vis[1010][1010];
int dx[4]{-1,0,1,0},dy[4]{0,1,0,-1};
vector<int> xx,yy;
int dfs(int x,int y){
	if(x<1||x>n||y<1||y>m||vis[x][y]||s[x][y]=='#') return 0;
	vis[x][y]=1;
	if(s[x-1][y]=='#'||s[x+1][y]=='#'||s[x][y-1]=='#'||s[x][y+1]=='#'){
		xx.push_back(x),yy.push_back(y);
		return 1;
	}
	int ans=1;
	for(int i=0;i<4;i++){
		ans+=dfs(x+dx[i],y+dy[i]);
	}
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		s[i]=' '+s[i];
	}
	int ans=INT_MIN;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans=max(ans,dfs(i,j));
			int len=xx.size();
			for(int k=0;k<len;k++){
				vis[xx[k]][yy[k]]=0;
			}
			xx.clear(),yy.clear();
		}
	}
	cout<<ans;
	return 0;
}
2024/4/29 21:55
加载中...