题目:给你三个数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;
}
京公网安备 11010502036488号