题意简述
给定直角坐标系中一个正方形任意两个不同顶点的坐标\(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
题解
根据正方形的边长相等这一性质进行另外两个顶点的坐标计算。给定的两个点的关系共有四种情况:
- 两点的连线与x轴平行。(两点的横坐标相等)
- 两点的连线与y轴平行。(两点的纵坐标相等)
- 两点为正方形对角线上的两个点。(两点横坐标差值的绝对值与纵坐标差值的绝对值相等)
- 两点无法同时作为一个正方形的两个不同顶点。(除以上三种情况外的所有情况)
判断两点的关系,之后就可以根据边长进行计算得出结果。
代码
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; }
|