利用二维前缀和,来判断区间是否存在建筑
所以我们就可以利用二维的前缀和来判断,这个区间的和是否大于0,如大于则存在建筑,反之则无。
AC代码如下:
#include <iostream> #define N 1006 using namespace std; int n,m,k; int map[N][N]; int sum[N][N]; int seek(){ int count = 0; for(int i = k; i <= n; i++){ for(int j = k; j <= m; j++){ if(sum[i][j] - sum[i][j-k] - sum[i-k][j] + sum[i-k][j-k] > 0)count++; } } return count; } int main(){ string s; cin >> n >> m >> k; getchar(); for(int i = 1; i <= n; i++) { getline(cin,s); for(int j = 1; j <= m; j++) { map[i][j] = s[j-1] - '0'; } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ sum[i][j] = sum[i-1][j] + sum[i][j-1] + map[i][j] - sum[i-1][j-1]; } } cout << seek() << endl; return 0; }