列表

详情


NC53676. 「土」秘法地震

描述

帕秋莉掌握了一种土属性魔法 

这种魔法可以在一片k×k大小的一个正方形区域内产生地震

但是如果某片即将产生地震的区域内有建筑物,帕秋莉会停止施法

整个地图大小为n×m,其中一些地方有建筑

请问有多少种可能的情况,使得帕秋莉会停止施法

输入描述

第一行三个数n, m, k,意义见描述
接下来一个n×m的01矩阵表示这篇区域的情况,1表示这个地方有建筑

输出描述

输出一个数表示答案

示例1

输入:

4 4 2
1000
0100
0000
0001

输出:

5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1416ms, 内存消耗: 26004K, 提交时间: 2021-06-07 01:54:38

n, m, k = map(int, input().split())
a = [input().strip() for _ in range(n)]
s = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(n):
	for j in range(m):
		s[i + 1][j + 1] = (1 if a[i][j] == '1' else 0) + s[i][j + 1] + s[i + 1][j] - s[i][j]
ans = 0
for i in range(k, n + 1):
	for j in range(k, m + 1):
		c = s[i][j] - s[i][j - k] - s[i - k][j] + s[i - k][j - k]
		if c != 0: ans += 1
print(ans)

C++(g++ 7.5.0) 解法, 执行用时: 51ms, 内存消耗: 8240K, 提交时间: 2023-03-12 22:01:21

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[1005][1005];
int main(){
	int n,m,k,cnt=0;
	char a;
    cin>>n>>m>>k;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		cin>>a;
		s[i][j]=s[i-1][j]+s[i][j-1]+(a-48)-s[i-1][j-1];
	}
	for(int i=k;i<=n;i++){
		for(int j=k;j<=m;j++){
			if(s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k]>0) cnt++;
		}
	}
	cout<<cnt;
}

C++(clang++ 11.0.1) 解法, 执行用时: 60ms, 内存消耗: 5260K, 提交时间: 2023-03-12 21:18:05

#include<bits/stdc++.h>
using namespace std;
int s[1005][1005];
int main(){
	memset(s,0,sizeof(s));
	int n,m,k,cnt=0; cin>>n>>m>>k;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		char a; cin>>a;
		s[i][j]=s[i-1][j]+s[i][j-1]+(a-'0')-s[i-1][j-1];
	}
	for(int i=k;i<=n;i++) for(int j=k;j<=m;j++){
		if(s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k]>0) cnt++;
	}
	cout<<cnt;
}

上一题