题目:
#include <iostream> using namespace std; bool map[101][101]; int W, H, n; struct dot { int x, y; }dots[100010]; int dot1[10000], dot2[10000]; void quicksort(int left, int right, int *dotx) { int i, j, temp; if (left < right) { i = left, j = right, temp = dotx[left]; while (i < j) { while (i < j&&dotx[j] >= temp) j--; dotx[i] = dotx[j]; while (i < j&&dotx[i] <= temp) i++; dotx[j] = dotx[i]; } dotx[i] = temp; quicksort(left, j - 1, dotx); quicksort(j + 1, right, dotx); } } void Count(int *dot, int i) { int x, y, sum; sum = 0; x = dots[i].x; y = dots[i].y; y--; while (map[x][y] && y >= 0) //统计左边点的个数 { sum++; y--; } y = dots[i].y; y++; while (map[x][y] && y < H) //统计右边点的个数 { sum++; y++; } y = dots[i].y; x--; while (map[x][y] && x >= 0) //统计下面点的个数 { sum++; x--; } x = dots[i].x; x++; while (map[x][y] && x < W) //统计上面点的个数 { sum++; x++; } dot[i] = sum; } int main() { int t; cin >> t; int sum1, sum2; while (t--) { sum1 = sum2 = 0; memset(map, false, sizeof(map)); cin >> W >> H >> n; for (int i = 1; i <= n; i++) //输入第一组点 { cin >> dots[i].x >> dots[i].y; map[dots[i].x][dots[i].y] = true; } for (int i = 1; i <= n; i++) Count(dot1, i), sum1 += dot1[i]; //第一张图的连续点数 memset(map, false, sizeof(map)); for (int i = 1; i <= n; i++) //输入第二组点 { cin >> dots[i].x >> dots[i].y; map[dots[i].x][dots[i].y] = true; } for (int i = 1; i <= n; i++) Count(dot2, i), sum2 += dot2[i]; //第二张图的连续点数 if (sum1 != sum2) cout << "NO" << endl; else { quicksort(1, n, dot1); quicksort(1, n, dot2); int flag = 1; for (int i = 1; i <= n; i++) { if (dot1[i] != dot2[i]) { //我之前在这里写了输出用来看数据的 //我提交的时候忘记删了,结果还对了 //不得不说这测试数据是真的水 flag = 0; break; } } if (flag) cout << "YES" << endl; else cout << "NO" << endl; } } }
来源:http://bk.bk3r.com/?f=s2gou&br3rd=1&wn=1&hid=99_16_16_0_&ty3=0&tryno=1509
原文:https://www.cnblogs.com/sweet-ginger-candy/p/11518195.html