首页 > 试题广场 >

扫描透镜

[编程题]扫描透镜
  • 热度指数:15208 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
在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;
}

编辑于 2016-03-01 14:24:27 回复(12)