在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 <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int dx[] = {-1,-1,0,1,1,1,0,-1},dy[] = {0,1,1,1,0,-1,-1,-1}; int main(){ int n,m,k; while(scanf("%d%d%d",&n,&m,&k) != EOF){ int map[30][30]; int ret = 0; memset(map,0,sizeof(map)); for(int i = 0;i < k;++ i){ int x,y; scanf("%d%d",&x,&y); map[x - 1][y - 1] += 1; } for(int i = 0;i < n;++ i) for(int j = 0;j < m;++ j) for(int u = 0;u < n;++ u) for(int v = 0;v < m;++ v){ int cnt[30][30]; memset(cnt,0,sizeof(cnt)); int tmp = 0; ++ cnt[i][j]; if(map[i][j]) ++ tmp; for(int k = 0;k < 8;++ k){ int ex = dx[k] + i,ey = dy[k] + j; if(ex >= 0 && ex < n && ey >= 0 && ey < m && cnt[ex][ey] < map[ex][ey]) tmp += 1,cnt[ex][ey] += 1; } ++ cnt[u][v]; if(map[u][v] >= cnt[u][v]) ++ tmp; for(int k = 0;k < 8;++ k){ int ex = dx[k] + u,ey = dy[k] + v; if(ex >= 0 && ex < n && ey >= 0 && ey < m && map[ex][ey] > cnt[ex][ey]) tmp += 1,cnt[ex][ey] += 1; } if(tmp > ret) ret = tmp; } printf("%d\n",ret); } return 0; }