方格稿纸(二维前缀和)

这篇博客介绍了如何利用二维前缀和解决魔幻方阵的问题。魔幻方阵是指在给定的方格稿纸上,特定大小的正方形区域内,黑白格子数量差不超过1。文章通过一个实例展示了如何计算被涂黑的稿纸中满足条件的魔幻方阵数量,并提供了C++代码实现。
摘要由CSDN通过智能技术生成

题目描述

小 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值