牛客网---2016---网易扫描滤镜

来源:互联网 发布:成都杜甫草堂美食知乎 编辑:程序博客网 时间:2024/06/14 03:57

题目:
在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)处提莫种了一个蘑菇.
一个方格可以种无穷个蘑菇.
输出:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
解析:
1. 首先值得注意的是,每次清理过的地方,蘑菇就会消失,但是每个小方格可能种植多个蘑菇,所以每次扫描蘑菇数目-1,并不能完全清楚,换句话讲,就是每一个方格一次只能清理掉一个蘑菇。
解题所需函数:
1 . 涉及到了很重要的概念,参数为数组时候的函数。
传对象或是数组。因为对象和数组传的是引用。基本数据类型传的是值。当传入参数时,会在函数内部copy一分放在栈中。对于对象或数组被传时结果是多个引用指向同一个对象。通过引用改变对象的状态。这种改变出了函数依然存在。
代码:

import java.util.*;// 主函数public class Main {    public static void main(String[] args) {        // 用于获取控制台数据        Scanner scanner = new Scanner(System.in);        // 初始化第一行将要录入的数据 草地长,草地宽,种植个数        int N = 0;        int M = 0;        int K = 0;        //        while (scanner.hasNext()) {            // 赋值第一行数据            N = scanner.nextInt();            M = scanner.nextInt();            K = scanner.nextInt();            // 做数据溢出整理,如果不满足条件,直接return            if (N <1 || N >20){                return;            }            if (M <1 || M >20){                return;            }            if (K <0 || K >100){                return;            }            // 用于几率炸弹地点,初始值为0,一个方格允许种植很多个蘑菇,为了操作方便,保存一波            int[][] land = new int[M + 1][N + 1];            // 初始值,并录入相应数据,结果是一个N*M的矩阵            int x = 0, y = 0;            for (int i = 0; i < K; i++) {                x = scanner.nextInt();                y = scanner.nextInt();                land[y][x]++;            }            // 记录两次扫描的最大结果            int max = 0, secondmax = 0;            // 分别记录两次数据            max = findMaxIn(land);            secondmax = findMaxIn(land);            // 打印结果            System.out.println(max + secondmax);        }    }    // 私有静态函数? 返回值--int型  参数--维数组    private static int findMaxIn(int[][] land) {        // 定义值        int max = 0;        int maxX = 0, maxY = 0;        int num = 0;        // 遍历二维数组,一度想把1改成2,但是因为有时候,有的是数据是1,所以千万不要改        for (int i = 1; i < land.length - 1; i++) {            // 横轴为land.length,纵轴为land[0].length            for (int j = 1; j < land[0].length - 1; j++) {                // 以该点为中心辐射,做一个九宫格,判断数据                for (int k = i-1; k <=i+1; k++) {                    for (int m = j-1; m <=j+1; m++) {                        // 若该点有蘑菇,则进行累加                        if(land[k][m]>0)                            num++;                    }                }                // 最简单的替换原则,并记录该点信息                if (num > max){                    max = num;                    maxX = j;                    maxY = i;                }                // 重新归零,进行下一次遍历                num = 0;            }        }        // 遍历结束后,更新数值        for (int i = maxY - 1; i <= maxY + 1; i++) {            for (int j = maxX - 1; j <= maxX + 1; j++) {                if (land[i][j] > 0)                    land[i][j]=land[i][j]-1;            }        }        // 返回结果        return max;    }}
原创粉丝点击