P1191 矩形
------------恢复内容开始------------
题意
给出一个\(n*n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量
分割线
Ⅰ.暴力出奇迹!!!
①枚举矩形左上角的点(两重循环)
②枚举矩形的长和宽(两重循环)
③一个点一个点得验证矩形是否合法(两重循环)
但是非非非非常明显的,步骤三可以优化掉。
\(我们想要的不过是矩形内都是白色,二位前缀和可以很方便的做到。\)
\(假如白色是代表1,黑色代表2,那么矩形的值应该是它面积的大小\)
\(所以4重循环还是很快的!!\)
#include <bits/stdc++.h>
using namespace std;
int n,sumn[159][159];
char a[159][159];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
int k=0;
if(a[i][j]=='W') k=1;
sumn[i][j]=sumn[i-1][j]+sumn[i][j-1]+k-sumn[i-1][j-1];
}
int ans=0;
for(int i=1;i<=n;i++)//枚举长
for(int j=1;j<=n;j++)//枚举高
for(int q=1;q+i-1<=n;q++)
for(int w=1;w+j-1<=n;w++)
{
int temp;
int x=i+q-1,y=j+w-1;
temp=sumn[x][y]-sumn[q-1][y]-sumn[x][w-1]+sumn[q-1][w-1];
if(temp==i*j) ans++;
}
cout<<ans;
}
Ⅱ.\(n^3\)做法
虽然看懂了,但感觉并不是很好理解
想了解请点我(●'◡'●)
------------恢复内容结束------------
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步