P5198 [USACO19JAN] Icy Perimeter S
>>>vis[][] -> 减少访问
》》》dfs 要检查返回

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1e5+10; char ch[1111][1111]; int vis[1111][1111],sum_s,sum_c,n,ans_s=0,ans_c=0x3f3f3f3f; int dx[]={0,-1,0,1,0}; int dy[]={0,0,1,0,-1}; void dfs(int x,int y) { if(vis[x][y]) return; vis[x][y]=1; for(int i=1;i<=4;i++) { int nx=dx[i]+x,ny=dy[i]+y; if(nx>n||nx<1||ny>n||ny<1||ch[nx][ny]=='.') { sum_c++;continue; } if(ch[nx][ny]=='#'&&vis[nx][ny]==0) sum_s++,dfs(nx,ny); } // return; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) cin>>ch[i]+1; /*for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) cout<<ch[i][j]; cout<<endl; } */ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(ch[i][j]=='#'&&vis[i][j]==0) { sum_s=1,sum_c=0; //memset(vis,0,sizeof(vis)); dfs(i,j); //cout<<sum_c; //ddd if(ans_s<sum_s) ans_s=sum_s,ans_c=sum_c; else if(sum_s==ans_s) ans_c=min(ans_c,sum_c); } } } cout<<ans_s<<" "<<ans_c<<'\n'; return 0; }