[编程题-网易]扫描透镜

[编程题-网易]扫描透镜

在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。 

输入描述:
第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小;
接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.

第一次提交,理解错了题意

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
    int n, m, k;
    while (cin >> n >> m >> k)
    {

        vector<vector<int>> mat(n, vector<int>(m, 0));
        for (int i = 0; i<k; i++)
        {
            int x, y;
            cin >> x >> y;
            mat[x - 1][y - 1]++;
        }

        vector<vector<int>> sum(max(n - 2, 1), vector<int>(max(m - 2, 1), 0));
        
        for (int i = 0; i<sum.size(); i++)
        for (int j = 0; j<sum[0].size(); j++)
        {
                for (int p = i; p<min(i + 3, n); p++)
                for (int q = j; q<min(j + 3, m); q++)
                    sum[i][j] += mat[p][q];
        }
        
        
        int ans = 0;
        for (int i = 0; i<sum.size(); i++)
        for (int j = 0; j<sum[0].size(); j++)
        {
                for (int p = i; p<sum.size(); p++)
                for (int q = j; q<sum[0].size(); q++)
                {
                    int dup = 0;
                    for (int u = p; u<min(i + 3, n); u++)
                    for (int v = q; v<min(j + 3, m); v++)
                            dup += mat[u][v];
                    ans = max(ans, sum[i][j] + sum[p][q] - dup);
                }
        }
        cout << ans << endl;
    }
}

正确程序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int n,m,k;
    while(cin>>n>>m>>k)
    {
        vector<vector<int>> a(n,vector<int>(m,0)),b;
        for(int i=0;i<k;i++)
        {
            int x,y;
            cin>>x>>y;
            a[x-1][y-1]++;
        }
        int ans=0;
        for(int i=0;i<n-2;i++)
        for(int j=0;j<m-2;j++)
        {
            b=a;
            int sum1=0;
            for(int k=i;k<i+3;k++)
            for(int l=j;l<j+3;l++)
            {
                if(b[k][l]>0)
                {
                    sum1++;
                    b[k][l]--;
                }
            }
            //
            for(int ii=0;ii<n-2;ii++)
            for(int jj=0;jj<m-2;jj++)
            {
                int sum2=0;
                for(int k=ii;k<ii+3;k++)
                for(int l=jj;l<jj+3;l++)
                {
                    if(b[k][l]>0)
                    {
                        sum2++;
                    }
                }
                ans=max(ans,sum1+sum2);
            }
            //     
        }
        cout<<ans<<endl;  
    }
}
原文地址:https://www.cnblogs.com/learning-c/p/5742676.html