帕秋莉掌握了一种土属性魔法
这种魔法可以在一片k×k大小的一个正方形区域内产生地震
但是如果某片即将产生地震的区域内有建筑物,帕秋莉会停止施法
整个地图大小为n×m,其中一些地方有建筑
请问有多少种可能的情况,使得帕秋莉会停止施法
输入描述:
第一行三个数n, m, k,意义见描述 接下来一个n×m的01矩阵表示这篇区域的情况,1表示这个地方有建筑
输出描述:
输出一个数表示答案
示例1
输入
4 4 2 1000 0100 0000 0001
输出
5
思路:二维前缀和 如果这个区间中的数字之和是0的话就说明没有树,可以发动地震。 如果不为0说明有树,可以发动地震,计数器+1
为了代码书写方便: 二维前缀和的数组置为全局变量,且二维前缀的i和j从1开始存放元素
#include<iostream>
using namespace std;
char c[1010][1010];
int cc[1010][1010];
int s[1010][1010];
int m,n,k;
int main(){
cin>>n>>m>>k;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j){
cin>>c[i][j];
cc[i][j] = c[i][j] - '0';
}
for (int j = 1; j <= m; ++j)
s[0][j] = s[0][j - 1] + cc[0][j];
for (int i = 1; i <= n; ++i)
s[i][0] = s[i - 1][0] + cc[i][0];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j){
s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + cc[i][j];
}
int cnt = 0;
for (int i = k; i <= n; ++i)
for(int j = k; j <= m; ++j){
if (s[i][j] - s[i][j - k] - s[i - k][j] + s[i - k][j - k] != 0)
cnt ++;
}
cout<<cnt<<endl;
return 0;
}