开始的时候被数据输入给坑了,01矩阵输入的原来是字符。然后可以递推的求出每一个区间范围内的城市的前缀和,然后再求k* k大小区间里的区间和就ok了。

求区间和怎么求呢?

alt

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
const int M=1005;
int mp[M][M]; 
int d[M][M];
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char ch;
			cin>>ch;
			mp[i][j]=ch-'0';
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			d[i][j]=mp[i][j]+d[i-1][j]+d[i][j-1]-d[i-1][j-1];
			
		}
	}
	int ans=0;
	for(int i=k;i<=n;i++){
		for(int j=k;j<=m;j++){
			if(d[i][j]-d[i-k][j]-d[i][j-k]+d[i-k][j-k]){
				ans++;
			//	cout<<ans<<endl;
			}
		}
	}
	cout<<ans<<endl;
}