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; }