「土」秘法地震

答题卡

http://www.nowcoder.com/questionTerminal/68d4cc423c824d5881ecb314c78f0d1d

「土」秘法地震

思路:考查二维前缀和,怎么和二维前缀和联系起来?面积为k*k的正方形当存在建筑物(即有1时)会停止施法,而我们要找的是多少种情况会停止施法,换言之就是让我们在n * m的区间找内有多少个k *k的面积内和>0,因此前缀和处理,再扫面一边即可

二维前缀和

在一维的基础上,画图更容易理解,f[i] [j]代表从f[1] [1]到f[i] [j]所围成的矩阵之和,
那么我们第一步就是先构造前缀和,f[i] [j]=f[i-1] [j]+f[i] [j-1]-f[i-1] [j-1]
接下来就是扫描,f[i][j]-f[i-k][j]-f[i][j-k]+f[i-k][j-k]

注意:输入需用字符串读入后换成矩阵,也可用scanf直接读

#include<iostream>
#include<string>
using namespace std;
const int N=1e3+5;
int f[N][N];
string s[N];
int main()
{
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    cin>>s[i];
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    f[i][j]=s[i][j-1]-'0';

     for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)
     f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
     int res=0;
     for(int i=k;i<=n;i++)
     {
         for(int j=k;j<=m;j++)
         if(f[i][j]-f[i-k][j]-f[i][j-k]+f[i-k][j-k]!=0)res++;
     }
     cout<<res<<endl;
    return 0;
 } 
全部评论

相关推荐

昨天 22:55
已编辑
叮咚买菜
牛客吹哨人:建议细说...哨哥晚点统一更新到黑名单:不要重蹈覆辙!25届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1317104
叮咚买菜稳定性 10人发布 投递叮咚买菜等公司10个岗位 >
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务