给定一个棋盘棋子的坐标为(x, y)有效范围是[0, 18],输入其中两个棋子的坐标,找出是否存在第三个棋子,使得三个棋子连成一条线,返回第三个棋子的坐标
package firstexam;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
/**
* @author Ji yongmei
* @file null.java
* @create 2022-10-13 22:06
*/
public class SanZiLianXian {
private static int[] getPoint(int x1, int y1, int x2, int y2) {
int[][] pos = swapPos(x1, y1, x2, y2);
x1 = pos[0][0];
y1 = pos[0][1];
x2 = pos[1][0];
y2 = pos[1][1];
if (x1 == x2) {
// 横相等
return getHen(x1, y1, x1, y2);
} else if (y1 == y2) {
// 竖相等
return getShu(x1, y1, x2, y2);
} else if (((x1 > x2) && (y1 > y2)) || ((x2 > x1) && (y2 > y1))) {
// 45度的情况
return get45degree(x1, y1, x2, y2);
} else {
// 135度的情况
return get135degree(x1, y1, x2, y2);
}
}
public static int[][] swapPos(int x1, int y1, int x2, int y2) {
int[][] pos = new int[][] {{x1, y1}, {x2, y2}};
if (x1 > x2 || x1 == x2 && y1 > y2) {
pos[0][0] = x2;
pos[0][1] = y2;
pos[1][0] = x1;
pos[1][1] = y1;
}
return pos;
}
private static ArrayList<int[]> validList(ArrayList<int[]> list) {
Iterator<int[]> iterator = list.iterator();
while(iterator.hasNext()) {
int[] target = iterator.next();
if (target[0] > 18 || target[0] < 0 || target[1] > 18 || target[1] < 0) {
iterator.remove();
}
}
return list;
}
private static int[] getHen(int x1, int y1, int x2, int y2) {
if ((y1 + y2) % 2 == 0) {
return new int[]{x1, (y1 + y2) / 2};
}
else if (y2 - y1 == 1) {
// 判断是加到上面还是下面,是否合法,考虑边界
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[] {x1, y1 - 1});
list.add(new int[] {x1, y2 + 1});
return choosePoint(x1, y1, x2, y2, list);
} else {
return new int[] {-1, -1};
}
}
private static int[] getShu(int x1, int y1, int x2, int y2) {
if ((x1 + x2) % 2 == 0) {
return new int[]{(x1 + x2) / 2, y1};
}
else if (x2 - x1 == 1) {
// 判断是加到左边还是右边,是否合法,考虑边界
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[] {x1 - 1, y1});
list.add(new int[] {x2 + 1, y1});
return choosePoint(x1, y1, x2, y2, list);
} else {
return new int[] {-1, -1};
}
}
private static int[] get45degree(int x1, int y1, int x2, int y2) {
if ((x1 + x2) % 2 == 0 && (y1 + y2) % 2 == 0) {
return new int[] {(x1 + x2) / 2, (y1 + y2) / 2};
}
else if ((x2 - x1) == 1 && (y2 - y1) == 1) {
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[] {x1 - 1, y1 - 1});
list.add(new int[] {x2 + 1, y2 + 1});
return choosePoint(x1, y1, x2, y2, list);
}
else {
return new int[] {-1, -1};
}
}
private static int[] get135degree(int x1, int y1, int x2, int y2) {
if ((x1 + x2) % 2 == 0 && (y1 + y2) % 2 == 0) {
return new int[]{(x1 + x2) / 2, (y1 + y2) / 2};
} else if ((x2 - x1) == 1 && (y2 - y1) == -1) {
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[] {x1 - 1, y1 + 1});
list.add(new int[] {x2 + 1, y2 - 1});
return choosePoint(x1, y1, x2, y2, list);
}
else {
return new int[]{-1, -1};
}
}
public static int[] choosePoint(int x1, int y1, int x2, int y2, ArrayList<int[]> list) {
list = validList(list);
if (list.size() == 0) return new int[] {-1, -1}; // 都不满足要求
if (list.size() == 1) return new int[]{list.get(0)[0], list.get(0)[1]};
Collections.sort(list, (o1, o2) -> {
if (o1[0] != o2[0]) {
return o1[0] - o2[0];
}
return o1[1] - o2[1];
});
return new int[]{list.get(0)[0], list.get(0)[1]};
}
public static void main(String[] args) {
int[] point = getPoint(1, 0, 2, 0);
for (int i = 0; i < point.length; i++) {
System.out.print(point[i] + " ");
}
System.out.println();
int[] point1 = getPoint(0, 0, 3, 3);
for (int i = 0; i < point.length; i++) {
System.out.print(point1[i] + " ");
}
System.out.println();
int[] point2 = getPoint(2, 1, 1, 0);
for (int i = 0; i < point2.length; i++) {
System.out.print(point2[i]+ " ");
}
System.out.println();
int[] point3 = getPoint(1, 17, 0, 18);
for (int i = 0; i < point3.length; i++) {
System.out.print(point3[i]+ " ");
// 216
}
System.out.println();
int[] point4 = getPoint(18, 0, 17, 1);
for (int i = 0; i < point4.length; i++) {
System.out.print(point4[i]+ " ");
// 162
}
System.out.println();
int[] point5 = getPoint(18, 17, 17, 18);
for (int i = 0; i < point5.length; i++) {
System.out.print(point5[i]+ " ");
// -1 -1
}
System.out.println();
int[] point6 = getPoint(0, 17, 1, 18);
for (int i = 0; i < point6.length; i++) {
System.out.print(point6[i] + " ");
// -1 -1
}
System.out.println();
int[] point7 = getPoint(0, 0, 1, 1);
for (int i = 0; i < point7.length; i++) {
System.out.print(point7[i] + " ");
// 2 2
}
}
}