zoukankan      html  css  js  c++  java
  • 网易2016研发工程师编程题:扫描透镜

    扫描透镜
    在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.该方格内数减1
    3.暴力找第二个
    这样的方格就是,非空元素最大

    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;
                        }
                    }
                }
        }
    }
  • 相关阅读:
    HDU 3951 (博弈) Coin Game
    HDU 3863 (博弈) No Gambling
    HDU 3544 (不平等博弈) Alice's Game
    POJ 3225 (线段树 区间更新) Help with Intervals
    POJ 2528 (线段树 离散化) Mayor's posters
    POJ 3468 (线段树 区间增减) A Simple Problem with Integers
    HDU 1698 (线段树 区间更新) Just a Hook
    POJ (线段树) Who Gets the Most Candies?
    POJ 2828 (线段树 单点更新) Buy Tickets
    HDU 2795 (线段树 单点更新) Billboard
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5280741.html
Copyright © 2011-2022 走看看