[编程题-网易]扫描透镜
[编程题-网易]扫描透镜
在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; } }