题解

1 条题解

  • 1
    @ 2022-08-18 20:41:54
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans=1;//ans 用于求边长
    int a[305][305];
    bool b;
    bool check(int px,int py,int of)
    {
        int cl=a[px][py];
        px++;
        py++;
        if(a[px][py]!=cl)//当前的颜色和之前的不同,无法构成矩形
            return 0;
        for(int i=1; i<=of; i++)//两边枚举
            if(a[px-i][py]!=cl||a[px][py-i]!=cl)//只要不对就返回 0
                return 0;
        return 1;//否则返回 1
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                scanf("%d",&a[i][j]);
        for(int i=1; i<=n&&!b; i++)//枚举
            for(int j=1; j<=m; j++)
            {
                if(n-i<ans||m-j<ans)//剩余的比现在的 ans 小,没必要做
                {
                    if(n-i<ans)
                        b=1;//标识打上
                    break;
                }
                else
                {
                    int os=1,tx=i,ty=j;
                    while(tx<n&&ty<m)//在范围内,继续搜索
                    {
                        if(check(tx,ty,os))//满足条件
                        {
                            tx++;
                            ty++;
                            os++;//目前搜索的最大边长
                            ans=max(ans,os);//替换掉
                        }
                        else 
                            tx=n;
                    }
                }
            }
        printf("%d",ans*ans);//边长×边长是最终面积
        return 0;
    }
    
  • 1

信息

ID
1345
难度
6
分类
模拟 | 枚举搜索 点击显示
标签
递交数
7
已通过
1
通过率
14%
上传者