NC53676「土」秘法地震

「土」秘法地震

https://ac.nowcoder.com/acm/problem/53676

题目:给你三个数n,m,k,再给出n行m列的01数字排列,问你有多少个k*k范围里包含数字1的
思路:明显的二维前缀和求范围,利用char数组存储数字再计算二维前缀和即可
代码如下:

#include <iostream>
#include <string.h>
using namespace std;
char a[1005][1005];
int sum[1005][1005]= {0};
int main()
{

    int n,m,k;
    cin>>n>>m>>k;
    memset(a,'0',sizeof(a));
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>a[i][j];
            sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j]-'0';//二维前缀和
        }
    }
    int b,c;
    long long ans=0;
    for(b=k; b<=n; b++)
    {
        for(c=k; c<=m; c++)
        {
            if(sum[b][c]-sum[b-k][c]-sum[b][c-k]+sum[b-k][c-k]>0)ans++;//若k*k范围内有1则次数加一
        }
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务