首页 > 代码库 > 蒜头君打地鼠

蒜头君打地鼠

蒜头君打地鼠

蒜头君最近迷上了打地鼠,但他发现同时出现在面板上的地鼠太多,于是他想改进一下他的锤子,于是他拿出了一款 k \times kk×k 大小的正方形锤子,但是遗憾的是,这个锤子只能斜着砸。如下图所示:

技术分享

当 k=2k=2 时,若蒜头君敲击黑点,黑点和图中所有蓝色点将一并被敲到。

当 k=3k=3 时,锤子的图案如下所示:

 
 
 
 
 
1
- - * - -
2
- * * * -
3
* * x * *
4
- * * * -
5
- - * - -
 
 

kk 取其他值时以此类推。

注意:蒜头君只能敲击面板上的格子,但锤子不一定要全部落在面板内。

现在给定一个 n \times nn×n 的面板,每个格子可能有地鼠也可能没有地鼠,请编程计算用 k \times kk×k 大小锤子敲击时最多能打中多少地鼠。

输入格式

第一行 22 个整数 n,kn,k,表示面板大小和锤子大小。

接下来 nn 行,每行 nn 个整数,若为 11 代表该格子有地鼠,若为 00 代表该格子无地鼠。不会出现其他的数字。

输出格式

输出一个整数,代表最多能砸到的地鼠数。

数据规模

对于 5050% 的测试数据,满足 1 \le n \le 300,1 \le k \le 101n300,1k10;

对于 8080% 的测试数据,满足 1 \le n \le 2000,1 \le k \le101n2000,1k10;

对于 100100% 的测试数据,满足 1 \le n \le 2000,1 \le k \le 1001n2000,1k100。

样例说明

敲击第 22 行的 00,可以敲到周围的 44 个地鼠。

样例输入

3 2
0 1 1
1 0 1
0 1 0

样例输出

4

题解:

暴力水分

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
lol n,m,a[2001][2001],ans,mmax;
lol gi()
{
    lol ans=0,f=1;
    char i=getchar();
    while(i<0||i>9){if(i==-)f=-1;i=getchar();}
    while(i>=0&&i<=9){ans=ans*10+i-0;i=getchar();}
    return ans*f;
}
int main()
{
    lol i,j,k;
    n=gi();m=gi();
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            a[i][j]=gi();
            a[i][j]+=a[i][j-1];
        }
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            ans=0;
            ans+=a[i][min(n,j+m-1)]-a[i][max((lol)0,j-m)];
            for(k=1;k<m;k++)
            {
                lol s=min(j+m-k-1,n),ss=max(j-m+k,(lol)0);
                if(i+k<=n)ans+=a[i+k][s]-a[i+k][ss];
                if(i-k>=1)ans+=a[i-k][s]-a[i-k][ss];
            }
            mmax=max(mmax,ans);
        }
    }
    printf("%lld",mmax);
    return 0;
}

 

 

 

 

蒜头君打地鼠