CCF_201912-2试题及答案(Java)

CCF_201912-2(java)

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析

第二题的难度一般不大,但这次的第二题较以往要更难一些,根据题目描述有坐标又有对应的评分,两者是成对存在的,故可以考虑用map来进行存储管理,将坐标定义为键,再将评分定位为值,这样就可以根据坐标获取相应的评分了。
根据题目描述,只有上下左右四个位置均有垃圾才会考虑选址,题目所给评分标准是斜方向若有垃圾则加一分,为了减少代码量,我们可以再给上下左右四个位置加一个评分标准(权值),使得四个方向积分之和为0,当然,不能简单地设为1。四个斜方向的最高评分是4,那我们就只能将上下左右这四个方向的评分设的比4还大,这样就可以避免误判了。我这里设的是5,所以坐标的初始评分就是-20了。

参考代码

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	 public static void main(String[] args) {  
  		Scanner sca=new Scanner(System.in);
  		int n=sca.nextInt();
  		int[] score=new int[5];
  		int[] dx= {0,0,-1,1,-1,1,-1,1},dy= {1,-1,0,0,1,1,-1,-1};
  		Map<Key, Integer> map = new HashMap<Key,Integer>();
  
  		for(int i=0;i<n;i++) {
   			int x=sca.nextInt();
   			int y=sca.nextInt();
   			Key p = new Key(x,y);
   			map.put(p,-20);
   			int sum=-20;
   			for(int j=0;j<8;j++) { 
    				int dxx=dx[j]+x;
    				int dyy=dy[j]+y;
    				for (Key p2: map.keySet()) {
     					if(p2.getx()==dxx&&p2.gety()==dyy) {
      						int sum2=map.get(p2);
      						sum+=j<4?5:1;
      						sum2+=j<4?5:1;
      						map.put(p,sum);
      						map.put(p2,sum2);
      						break;
     					}
   				 }
   			}
  		}
  		sca.close();
  
  	for (Key k: map.keySet()) {
   		int sum=map.get(k);
   		if(sum>=0)
    		score[sum]++;
  	}
  	for(int i=0;i<5;i++)
   		System.out.println(score[i]);
 	}
}
class Key{
 	private int x;
 	private int y;
 	public Key(){
 	}
 	public Key(int x, int y){
  		this.x = x;
  		this.y = y;
 	}
 	public int getx()
 	{
  		return this.x;
 	}
 	public int gety()
 	{
  		return this.y;
 	}
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值