ccf练习题——回收站选址(java实现)

    技术2025-08-06  11

    ccf练习题——回收站选址

    根据题目,对回收站选址有两个选择要求:

    (x, y)必须是整数。上下左右,四个邻居位置必须全部存在垃圾,即(x +1, y)、(x - 1, y)、(x, y + 1)、(x, y - 1)坐标上有垃圾。

    有垃圾的点<==>输入的坐标 查找的代码:

    public static boolean chazhao(int num, int x1, int y1, int x[], int y[]) { boolean pd1 = false, pd2 = false, pd3 = false, pd4 = false; for(int i = 0; i < num; i++) { // 每次对一对坐标进行查找 if((x1 + 1) == x[i]) { // 题目条件:坐标的上下左右都有标记(垃圾点), 且坐标为整数 if(y[i] == y1) pd1 = true; } if((x1 - 1) == x[i]) { if(y[i] == y1) pd2 = true; } if((y1 + 1) == y[i]) { if(x[i] == x1) pd3 = true; } if((y1 - 1) == y[i]) { if(x[i] == x1) pd4 = true; } } if((pd1 && pd2 && pd3 && pd4) == true) return true; // x1,y1 对每一对坐标 比对后, 满足条件 返回true else return false; // 否则返回 false }

    对输入的坐标按照上述的要求进行筛选,查找出符合要求的点进行评估分数。 评分的代码:

    public static int pingfen(int num, int x1, int y1, int x[], int y[]) { int point = 0; // 记录评分 for(int i = 0; i < num; i++) { // 按照题目要求评分 if((x1 + 1) == x[i]) { // 合格点的斜对角有标记点(垃圾点) if((y1 + 1) == y[i]) point++; // 以判断x进入 和 以判断y 进入是一样的,不用重复写 if((y1 - 1) == y[i]) point++; } if((x1 - 1) == x[i]) { if((y1 + 1) == y[i]) point++; if((y1 - 1) == y[i]) point++; } } return point; }

    上面的代码都是对一个坐标进行筛选的操作,把他们在写进一个循环中。 筛选的代码:

    public static int[] shaixuan(int num, int x[], int y[]) { int point; int data [] = new int [5]; // 存放评分结果 for(int i = 0; i < num; i++) { if(chazhao(num, x[i], y[i], x, y)) { // 对于满足条件的坐标,进行评分 point = pingfen(num, x[i], y[i], x, y); switch(point) { case 0:{ data[0] += 1; break; } case 1:{ data[1] += 1; break; } case 2:{ data[2] += 1; break; } case 3:{ data[3] += 1; break; } case 4:{ data[4] += 1; break; } } } } return data; }

    完整代码:

    class Huishou{ public static boolean chazhao(int num, int x1, int y1, int x[], int y[]) { boolean pd1 = false, pd2 = false, pd3 = false, pd4 = false; for(int i = 0; i < num; i++) { // 每次对一对坐标进行查找 if((x1 + 1) == x[i]) { // 题目条件:坐标的上下左右都有标记(垃圾点), 且坐标为整数 if(y[i] == y1) pd1 = true; } if((x1 - 1) == x[i]) { if(y[i] == y1) pd2 = true; } if((y1 + 1) == y[i]) { if(x[i] == x1) pd3 = true; } if((y1 - 1) == y[i]) { if(x[i] == x1) pd4 = true; } } if((pd1 && pd2 && pd3 && pd4) == true) return true; // x1,y1 对每一对坐标 比对后, 满足条件 返回true else return false; // 否则返回 false } public static int pingfen(int num, int x1, int y1, int x[], int y[]) { int point = 0; // 记录评分 for(int i = 0; i < num; i++) { // 按照题目要求评分 if((x1 + 1) == x[i]) { // 合格点的斜对角有标记点(垃圾点) if((y1 + 1) == y[i]) point++; // 以判断x进入 和 以判断y 进入是一样的,不用重复写 if((y1 - 1) == y[i]) point++; } if((x1 - 1) == x[i]) { if((y1 + 1) == y[i]) point++; if((y1 - 1) == y[i]) point++; } } return point; } public static int[] shaixuan(int num, int x[], int y[]) { int point; int data [] = new int [5]; // 存放评分结果 for(int i = 0; i < num; i++) { if(chazhao(num, x[i], y[i], x, y)) { // 对于满足条件的坐标,进行评分 point = pingfen(num, x[i], y[i], x, y); switch(point) { case 0:{ data[0] += 1; break; } case 1:{ data[1] += 1; break; } case 2:{ data[2] += 1; break; } case 3:{ data[3] += 1; break; } case 4:{ data[4] += 1; break; } } } } return data; } public static void printArea(int x[]) { for(int i = 0 ; i < x.length; i++) { System.out.println(x[i]); } } public static void main(String args[]) { int x[] = new int[10000]; // 数组x 存储待处理垃圾的xi 坐标 int y[] = new int[10000]; // 数组y 存储待处理垃圾的yi 坐标 int point[] = new int[5]; // 存放评分结果,用于输出 Scanner input = new Scanner(System.in); int num = input.nextInt(); for(int i = 0; i < num; i++) { // 输入标记点(垃圾点)的坐标 x[i] = input.nextInt(); // x,y 分开存储 y[i] = input.nextInt(); } point = shaixuan(num, x, y); printArea(point); } }

    注意:main中的x,y数组大小要足够大,不然提交时会出现 运行错误。

    Processed: 0.010, SQL: 9