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数组大小要足够大,不然提交时会出现 运行错误。