扫描透镜
在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)处提莫种了一个蘑菇. 一个方格可以种无穷个蘑菇.
输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇. 解题扫描镜子,扫描了,都清理掉,答案不就是K吗? 无法理解题意 讨论中下面讲解
一个扫描透镜可以扫描出(3*3)方格中的所有蘑菇,问最多可清理多少个蘑菇就是求二维数组中哪一块(3*3)区域中的蘑菇数最多。 有两个透镜,那么最多可清理的蘑菇数就是第一个透镜最多清理的加上第二个透镜最多清理的(将求最多清理蘑菇数写成函数)。 需要注意的是对于每个方格如果其中有多个蘑菇那么一次扫描只能清理掉一个蘑菇。 这要求我们在求出第一个最优解后要对二维数组中的相应方格中的蘑菇数进行减1操作
1.暴力找到第一个3*3小方格内非空的个数2.该方格内数减13.暴力找第二个这样的方格就是,非空元素最大
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNext()){ int n = in.nextInt(); int m = in.nextInt(); int k = in.nextInt(); if(n<3) n=3; if(m<3) m=3; int[][] A = new int[n][m]; for(int i =0;i<k;i++){ int x = in.nextInt(); int y = in.nextInt(); A[x-1][y-1]++; } int first[] = new int[3]; int second[] = new int[3]; Scan(A,first); for(int i = first[1];i< first[1] + 3;i++){ for(int j = first[2];j<first[2] + 3;j++){ if(A[i][j]>0) A[i][j]--; } } Scan(A,second); System.out.println(first[0] + second[0]); } } public static void Scan(int[][] A,int[] arr){ int n = A.length; int m = A[0].length; for(int i =0;i<n - 2;i++){ for(int j =0;j< m -2;j++){ int num = 0; for(int u = i;u<i+3;u++){ for(int v =j;v<j+3;v++){ if(A[u][v] >0){ num++; } } } if(arr[0]<= num){ arr[0] = num; arr[1] = i; arr[2] = j; } } } } }
时间: 2024-10-05 19:11:12