解题思路

  1. 判断四个点能否构成正方形的简化方法:
    • 检查相邻边是否相等
    • 如果四条边都相等,则可能构成正方形
  2. 解题步骤:
    • 读取输入的坐标点
    • 计算相邻点之间的距离平方
    • 判断相邻边是否相等

代码

#include <iostream>
#include <vector>
#include <set>
using namespace std;

bool isSquare(vector<int>& x, vector<int>& y) {
    // 存储所有点对之间的距离平方
    set<int> distances;
    
    // 计算所有点对之间的距离平方
    for(int i = 0; i < 4; i++) {
        for(int j = 0; j < 4; j++) {
            if(i != j) {
                int dist = (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]);
                distances.insert(dist);
            }
        }
    }
    
    // 正方形应该只有两种距离:边长和对角线长
    return distances.size() == 2;
}

int main() {
    int T;
    cin >> T;
    
    while(T--) {
        // 读取输入的坐标
        string xs, ys;
        cin >> xs >> ys;
        
        vector<int> x(4), y(4);
        for(int i = 0; i < 4; i++) {
            x[i] = xs[i] - '0';
            y[i] = ys[i] - '0';
        }
        
        cout << (isSquare(x, y) ? "Yes" : "No") << endl;
    }
    
    return 0;
}
import java.util.*;

public class Main {
    static boolean isSquare(int[] x, int[] y) {
        // 计算相邻边的距离平方
        int d1 = (x[0]-x[1])*(x[0]-x[1]) + (y[0]-y[1])*(y[0]-y[1]);
        int d2 = (x[1]-x[2])*(x[1]-x[2]) + (y[1]-y[2])*(y[1]-y[2]);
        int d3 = (x[2]-x[3])*(x[2]-x[3]) + (y[2]-y[3])*(y[2]-y[3]);
        int d4 = (x[3]-x[0])*(x[3]-x[0]) + (y[3]-y[0])*(y[3]-y[0]);
        
        // 判断四条边是否相等
        return d1 == d2 && d2 == d3 && d3 == d4;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        
        while(T-- > 0) {
            String xs = sc.next();
            String ys = sc.next();
            int[] x = new int[4];
            int[] y = new int[4];
            for(int i = 0; i < 4; i++) x[i] = xs.charAt(i) - '0';
            for(int i = 0; i < 4; i++) y[i] = ys.charAt(i) - '0';
            
            System.out.println(isSquare(x, y) ? "Yes" : "No");
        }
    }
}
def dis(a, b):
    return (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1])


def solve(xs, ys):
    a = [int(xs[0]), int(ys[0])]
    b = [int(xs[1]), int(ys[1])]
    d = [int(xs[2]), int(ys[2])]
    c = [int(xs[3]), int(ys[3])]
    # 四条边相等,且为直角
    if dis(a, b) == dis(b, c) and dis(a, b) == dis(d, a) and dis(b, c) == dis(c, d):
        print("Yes")
    else:
        print("No")


T = int(input())

for i in range(T):
    xs = input()
    ys = input()
    solve(xs, ys)

算法及复杂度

  • 算法:几何计算
  • 时间复杂度: - 每组测试数据只需要固定次数的计算
  • 空间复杂度: - 只需要存储固定数量的坐标点