题目
分析
第二题的难度一般不大,但这次的第二题较以往要更难一些,根据题目描述有坐标又有对应的评分,两者是成对存在的,故可以考虑用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;
}
}