题目描述
小 y 终于在小学学会了一些字、词、句子,会写一点作文了。某一天,小 y 买了一张方格稿纸来写作文,稿纸是 行 列的,形状如下所示(图中 ):
某天小 y 的邻居 小 x 来 小 y 家玩,无聊地用黑墨水笔把 小 y 新买的方格稿纸涂黑了很多格子。每个格子不是完全黑色就是完全白色,如下图所示。
小 y 不能责怪小 x。作文写不成了,他也觉得很无聊,就开始数里面有多少“魔幻方阵”。如果稿纸中一个 的正方形区域满足以下两个条件,那么它就是魔幻方阵:
(1) 黑白格子的数量差不能超过 ;
(2) 不能小于 。
上图染色后的方格稿纸共有 个魔幻方阵( 个 的魔幻方阵 , 个 的魔幻方阵)。
现在,请你帮助小 y 编程计算被染色的稿纸里面有多少个魔幻方阵。
关于二维前缀和建议参考二维前缀和!_Banzed的博客-CSDN博客_二维前缀和
#include <iostream>
#include <math.h>
using namespace std;
int n,m,sum;
int a[310][310];
int dp[310][310];
int main() {
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
cin>>a[i][j];
dp[i][j] = dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];//动态转移式方程
}
int ans1,ans2;
for (int k=2;k<=max(n,m);k++) {
ans1=ans2=0;
for (int i=1;i<=n-k+1;i++) {
for (int j=1;j<=m-k+1;j++) {
int x=i+k-1,
y=j+k-1;
ans1 = dp[x][y]-dp[i-1][y]-dp[x][j-1]+dp[i-1][j-1];
ans2 = k*k-ans1;
if (abs(ans1-ans2) <= 1)
sum++;
}
}
}
cout<<sum;
return 0;
}