总体思路仍然是枚举所有情况,面向对象,可读性高,为了防止代码过长,没有进行属性封装。
用一个对象数组存储四个角点,通过实现comparator接口实现排序,通过排序保证了数组 0和3的对象是对角角点,于是对角线就是0,3 和 1,2
对角线中点重合,对角线长度相等且大于0,对角线互相垂直>>>>>>正方形
旋转,ox,oy为旋转中心:
int temp = x; x = -(y - oy) + ox; y = temp - ox + oy;
全部代码如下,值得注意的是对象数组传参时,排序会影响该数组,所以需要深copy该数组。
import java.util.*;
class Node {
public int x, y, ox, oy;
public int count;
public Node(int x, int y, int ox, int oy){
this.x = x;
this.y = y;
this.ox = ox;
this.oy = oy;
this.count = 0;
}
public void rotate(){
int temp = x;
x = -(y - oy) + ox;
y = temp - ox + oy;
count++;
if(count >= 4){
count = 0;
}
}
}
public class Main {
public static int isSquare(Node[] temp){
Node[] nodes = new Node[4];
for(int i = 0; i < 4; i++){
nodes[i] = new Node(temp[i].x, temp[i].y, 0, 0);
}
Arrays.sort(nodes, new Comparator<Node>() {
@Override public int compare(Node o1, Node o2){
if(o1.x != o2.x){
return Integer.compare(o1.x, o2.x);
}else{
return Integer.compare(o1.y, o2.y);
}
}
});
if(nodes[0].x + nodes[3].x == nodes[1].x + nodes[2].x && nodes[0].y + nodes[3].y == nodes[1].y + nodes[2].y){ //对角线中点重合
if((nodes[0].x - nodes[3].x) * (nodes[1].x - nodes[2].x) + (nodes[0].y - nodes[3].y) * (nodes[1].y - nodes[2].y) == 0){//对角线垂直
if(Math.pow(nodes[0].x - nodes[3].x, 2) + Math.pow(nodes[0].y - nodes[3].y, 2) == Math.pow(nodes[0].x - nodes[3].x, 2) + Math.pow(nodes[0].y - nodes[3].y, 2)){
if(Math.pow(nodes[0].x - nodes[3].x, 2) + Math.pow(nodes[0].y - nodes[3].y, 2) > 0 && Math.pow(nodes[0].x - nodes[3].x, 2) + Math.pow(nodes[0].y - nodes[3].y, 2) > 0){ //对角线长度>0
return temp[0].count + temp[1].count + temp[2].count + temp[3].count;
}
}
}
}
return -1;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 0; i < n; i++){
Node[] nodes = new Node[4];
for(int j = 0; j < 4; j++){
int a = sc.nextInt();
int b = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
nodes[j] = new Node(a, b, x, y);
}
int cnt = -1;
for(int k1 = 0; k1 < 4; k1++){
nodes[0].rotate();
for(int k2 = 0; k2 < 4; k2++){
nodes[1].rotate();
for(int k3 = 0; k3 < 4; k3++){
nodes[2].rotate();
for(int k4 = 0; k4 < 4; k4++){
nodes[3].rotate();
int temp = isSquare(nodes);
if(temp != -1){
if(cnt == -1){
cnt = temp;
}else{
cnt = Math.min(temp, cnt);
}
}
}
}
}
}
System.out.println(cnt);
}
}
}

京公网安备 11010502036488号