https://www.nowcoder.com/questionTerminal/6a219d196df44d3abd82fbadb1a62c3f?orderByHotValue=1&questionTypes=000100&mutiTagIds=592&page=1&onlyReference=false
在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 <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <math.h>
int main(){
int n,m,k;
int N[22][22];
int fx[]={1,1,1,0,0,-1,-1,-1};
int fy[]={1,0,-1,1,-1,1,0,-1};
while(scanf("%d %d %d",&n,&m,&k)!=EOF){
for(int i=0;i<=n;++i)
for(int j=0;j<=m;++j)
N[i][j]=0;
int x,y;
for(int i=0;i<k;++i)
{
scanf("%d %d",&x,&y);
N[x][y]++;
}
// for(int i=1;i<=n;++i)
// {
// for(int j=1;j<=m;++j){
//
// printf("%d ",N[i][j]);
// }
// printf("\n");
// }
int px,py,cx=1,cy=1,s=0,total=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
x = i;
y = j;
int sum=0;
for(int l=0;l<8;++l){
px = x+fx[l];
py = y+fy[l];
if(px<1||py<1||px>n||py>m)
continue;
if(N[px][py]>0)
sum++;
}
if(N[x][y]>0)
sum++;
if(sum>s){
s=sum;
cx=i;
cy=j;
}
}
for(int l=0;l<8;++l){
px = cx+fx[l];
py = cy+fy[l];
if(px<1||py<1||px>n||py>m)
continue;
if(N[px][py]>0)
{
N[px][py]--;
}
}
if(N[cx][cy]>0)
{
N[cx][cy]--;
}
total+=s;
// printf("%d %d\n",cx,cy);
//
//
// for(int i=1;i<=n;++i)
// {
// for(int j=1;j<=m;++j){
//
// printf("%d ",N[i][j]);
// }
// printf("\n");
// }
s=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
x = i;
y = j;
int sum=0;
for(int l=0;l<8;++l){
px = x+fx[l];
py = y+fy[l];
if(px<1||py<1||px>n||py>m)
continue;
if(N[px][py]>0)
sum++;
}
if(N[x][y]>0)
sum++;
if(sum>s){
s=sum;
cx=i;
cy=j;
}
}
total+=s;
// printf("%d %d\n",cx,cy);
printf("%d\n",total);
}
return 0;
}