CSP认证2019-12-2-回收站选址-(Java)100分

回收站选址

问题描述
试题编号: 201912-2
试题名称: 回收站选址
时间限制: 1.0s
内存限制: 512.0MB
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Java满分代码
在这里插入图片描述
Java代码

import  java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;

public class Main {
    public static void main(String [] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.valueOf(br.readLine());
        int[][] point = new int[n+2][2];
        int[] res = new int[5];// 代表分 0 1 2 3 4

        HashMap<Integer, HashSet<Integer>> map = new HashMap<>();

        for(int i = 1;i <= n;i++){
            String[] str = br.readLine().trim().split(" ");
            int x = Integer.valueOf(str[0]);
            int y = Integer.valueOf(str[1]);
            point[i][0] = x;          // 记录垃圾坐标
            point[i][1] = y;
            if(map.containsKey(x)){
                map.get(x).add(y);
            }else{
                map.put(x, new HashSet<Integer>());
                map.get(x).add(y);
            }
        }

        for(int i = 1;i <= n;i++){
            // 当前列存在左右列
            if(map.containsKey(point[i][0]-1) && map.containsKey(point[i][0]+1)){
                HashSet<Integer> set_c = map.get(point[i][0]);   // 当前列
                HashSet<Integer> set_r = map.get(point[i][0]+1); // 当前列右边一列
                HashSet<Integer> set_l = map.get(point[i][0]-1); // 当前列左边一列
                if(set_c.contains(point[i][1]+1) && set_c.contains(point[i][1]-1) &&
                        set_r.contains(point[i][1]) && set_l.contains(point[i][1])){ // 可以建回收站
                    int score = 0;    // 得分
                    if(set_l.contains(point[i][1]+1))
                        score++;
                    if(set_l.contains(point[i][1]-1))
                        score++;
                    if(set_r.contains(point[i][1]+1))
                        score++;
                    if(set_r.contains(point[i][1]-1))
                        score++;
                    res[score]++;    // 该分数的回收站个数+1
                }
            }
        }

        for(int i = 0;i < 5;i++)
            System.out.println(res[i]);
    }
}

本题坐标x,y 取到到了109,不可以开这么大的数组,也就是如果使用arr[x][y]是拿不了满分的。

原文地址:https://www.cnblogs.com/jiaohuadehulike/p/14294992.html