暴力求解
矩形被切一刀分为
1.矩形+矩形
2.非平行四边形+非平行四边形
3.三角形+五边形
4.三角形+四边形
5.三角形+三角形
#pragma warning(disable:4996)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int N, k, a, b;
struct node { int x[2]; node(int a = 0, int b = 0) { x[0] = a, x[1] = b; } };
vector<node> in[2]; vector<int> A[2][2];
bool pd() {
if (min(A[0][0][0], A[0][1][0]) == min(A[1][0][0], A[1][1][0]) &&
max(A[0][0][0], A[0][1][0]) == max(A[1][0][0], A[1][1][0]))
return true;
return false;
}
int main() {
#ifdef _DEBUG
freopen("in", "r", stdin);
#endif // _DEBUG
scanf("%d", &N);
while (N--) {
for (int i = 0; i < 2; ++i) {
in[i].clear();
A[i][0].clear(), A[i][1].clear();
scanf("%d", &k);
for (int j = 0; j < k; ++j)
scanf("%d %d", &a, &b), in[i].push_back(node(a, b));
for (int f = 0; f < 2; ++f)
for (int x = 0; x < k; ++x)
for (int y = x + 1; y < k; ++y)
if (in[i][x].x[f] == in[i][y].x[f])
A[i][f].push_back(abs(in[i][x].x[1 - f] - in[i][y].x[1 - f]));
if (A[i][0].size() > A[i][1].size()) swap(A[i][0], A[i][1]);
}
if (in[0].size() > in[1].size()) swap(A[0], A[1]);
if (A[0][0].size() == 1 && A[0][1].size() == 1) {
if (A[1][0].size() == 1 && A[1][1].size() == 1) {
if (pd()) {
printf("YES\n"); continue;
}
}
else if (A[1][0].size() == 1 && A[1][1].size() == 2) {
A[1][1][0] = abs(A[1][1][0] - A[1][1][1]);
if (pd()) {
printf("YES\n"); continue;
}
}
else if (A[1][0].size() == 2 && A[1][1].size() == 2) {
A[1][0][0] = abs(A[1][0][0] - A[1][0][1]);
A[1][1][0] = abs(A[1][1][0] - A[1][1][1]);
if (pd()) {
printf("YES\n"); continue;
}
}
}
else if (A[0][0].size() == 1 && A[0][1].size() == 2) {
if (A[1][0].size() == 1 && A[1][1].size() == 2) {
if(A[0][0][0]==A[1][0][0] && abs(A[1][1][0] - A[1][1][1])== abs(A[0][1][0] - A[0][1][1])) {
printf("YES\n"); continue;
}
}
}
else if (A[0][0].size() == 2 && A[0][1].size() == 2) {
if (A[1][0].size() == 2 && A[1][1].size() == 2) {
if ((A[0][0][0] == A[0][0][1] && A[0][1][0] == A[0][1][1] &&
A[1][0][0] == A[1][0][1] && A[1][1][0] == A[1][1][1]) ||
(A[0][0][0] == A[1][0][0] || A[0][0][0] == A[1][1][0] ||
A[0][1][0] == A[1][0][0] || A[0][1][0] == A[1][1][0])) {
printf("YES\n"); continue;
}
}
}
printf("NO\n");
}
}