1 条题解

  • 0
    @ 2025-12-29 13:17:41

    思路

    逐个访问每一坨冰淇淋,对于每一个点,如果它一个方向上有冰淇淋,就继续往下访问,否则就是访问到边界了,周长加1

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1100;
    int dx[4]={1,0,-1,0};
    int dy[4]={0,-1,0,1};
    char s[N];
    bool a[N][N],v[N][N];
    int n;
    pair<int,int> dfs(int x,int y)
    {
    	if(v[x][y])return {0,0};
    	v[x][y]=1;
    	int res=1,c=0;
    	for(int i=0;i<=3;i++)
    	{
    		int xx=x+dx[i],yy=y+dy[i];
    		if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[xx][yy])
    		{
    			pair<int,int> no=dfs(xx,yy);
    			res+=no.first,c+=no.second;
    		}
    		else c++;
    	}
    	return {res,c};
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%s",s+1);
    		for(int j=1;j<=n;j++)a[i][j]=(s[j]=='#');
    	}
    	int ma=0,ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)if(!v[i][j]&&a[i][j])
    		{
    			pair<int,int> no=dfs(i,j);
    			if(no.first>ma)ma=no.first,ans=no.second;
    			else if(no.first==ma)ans=min(ans,no.second);
    		}
    	}
    	printf("%d %d\n",ma,ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    6967
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者