0%

Codeforces 459A 解题报告

题意简述

给定直角坐标系中一个正方形任意两个不同顶点的坐标\(x _ 1,y _ 1,x _ 2,y _ 2 (-100 \leq x _ 1,y _ 1,x _ 2,y _ 2 \leq 100)\) ,求另外两个点的坐标\(x _ 3,y _ 3,x _ 4,y _ 4(-1000 \leq x _ 3,y _ 3,x _ 4,y _ 4 \leq 1000)\)。如果给定的两个点无法同时作为一个正方形的两个不同顶点,输出 \(-1\)

时间限制:1s 空间限制:256MB

题目链接

Codeforces 459A

题解

根据正方形的边长相等这一性质进行另外两个顶点的坐标计算。给定的两个点的关系共有四种情况:

  1. 两点的连线与x轴平行。(两点的横坐标相等)
  2. 两点的连线与y轴平行。(两点的纵坐标相等)
  3. 两点为正方形对角线上的两个点。(两点横坐标差值的绝对值与纵坐标差值的绝对值相等)
  4. 两点无法同时作为一个正方形的两个不同顶点。(除以上三种情况外的所有情况)

判断两点的关系,之后就可以根据边长进行计算得出结果。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
int diffX = x2 - x1,diffY = y2 - y1;
if(diffX == 0) {
cout << x1 + diffY << " " << y1 << " " << x1 + diffY << " " << y2 << endl;
}else if(diffY == 0){
cout << x1 << " " << y1 + diffX << " " << x2 << " " << y1 + diffX << endl;
}else if(abs(diffX) == abs(diffY)) {
cout << x1 << " " << y1 + diffY << " " << x1 + diffX << " " << y1 << endl;
}else {
cout << -1 << endl;
}
return 0;
}