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;
}