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

 

 
posted @ 2023-07-29 10:49  JMXZ  阅读(4)  评论(0)    收藏  举报