题目:给你三个数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; }