题目描述
小Q搜寻了整个魔法世界找到了四块魔法石所在地,当4块魔法石正好能构成一个正方形的时候将启动魔法阵,小Q就可以借此实现一个愿望。
现在给出四块魔法石所在的坐标,小Q想知道他是否能启动魔法阵
输入描述:
输入的第一行包括一个整数(1≤T≤5)表示一共有T组数据
每组数据的第一行包括四个整数x[i](0≤x[i]≤10000),即每块魔法石所在的横坐标
每组数据的第二行包括四个整数y[i](0≤y[i]≤10000),即每块魔法石所在的纵坐标
输出描述:
对于每组数据,如果能启动魔法阵输出“Yes”否则输出“No”。
示例1
输入
3 0022 0202 0156 1605 0077 0303
输出
Yes Yes No
遍历可以组成的线段集和。
四条边相等 = 菱形
菱形相邻的两条边垂直 = 正方形
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii;
int getlen(pii p1, pii p2)
{
return (p2.first - p1.first) * (p2.first - p1.first) + (p2.second - p1.second) * (p2.second - p1.second);
}
bool solve(const vector<pii> &node)
{
for(int i = 0; i < 4; ++ i)
{
for(int j = 0; j < 4; ++j)
{
if(j == i)
continue;
for(int k = 0; k < 4; ++k)
{
if(k == j || k == i)
continue;
for(int l = 0; l < 4; ++l)
{
if(l == i || l == j || l == k)
continue;
int ab = getlen(node[i], node[j]);
int ac = getlen(node[i], node[k]);
int bd = getlen(node[j], node[l]);
int cd = getlen(node[k], node[l]);
if(ab == ac && ab == bd && ab == cd)
{
if((node[j].first-node[i].first)*(node[k].first - node[i].first)+
(node[j].second-node[i].second)*(node[k].second - node[i].second) == 0)
return true;
}
}
}
}
}
return false;
}
int main()
{
int n;
cin >> n;
while(n--)
{
string x;
string y;
cin >> x >> y;
vector<pii> node(4);
for(int i = 0; i < 4; ++i)
{
node[i].first = x[i] - '0';
node[i].second = y[i] - '0';
}
if(solve(node))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}