题目大意
平面上有n个矩阵,和n个数字,对于每个矩阵选择矩阵内的一个数字作为编号,让你给出唯一方案,使每个数字只作为一个矩阵的编号(多种方案即为不可行的)
解题思路
因为多种方案是不可行的,所以找到一个数字,它只在一个矩阵内,然后将其绑定,继续操作
对于一个矩阵内只有一个数字的,如果是可行的,那么简单推一下,可以发现消到最后,还是会出现前面的情况,所以无需考虑
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100
using namespace std;
int n, m, s, v, p[N], pp[N], xx[N], yy[N], x[N][2], y[N][2];
bool pd(int i, int j)
{if (x[j][0] <= xx[i] && xx[i] <= x[j][1])if (y[j][0] <= yy[i] && yy[i] <= y[j][1])return true;return false;
}
int main()
{scanf("%d", &n);m = n;for (int i = 1; i <= n; ++i)scanf("%d%d%d%d", &x[i][0], &x[i][1], &y[i][0], &y[i][1]);for (int i = 1; i <= n; ++i)scanf("%d%d", &xx[i], &yy[i]);while(m){for (int i = 1; i <= n; ++i){if (pp[i]) continue;//选过了s = 0;v = 0;for (int j = 1; j <= n; ++j)if (pd(i, j) && !p[j]) s++, v = j;//查找包括它的矩阵个数if (!s) break;if (s == 1)//只有一个,就直接绑定{p[v] = i;pp[i] = 1;m--;break;}}if (s != 1) break;//到最后一都没找到就退出}if (m) puts("None");else{for (int i = 1; i <= n; ++i){putchar(i + 'A' - 1);printf(" %d\n", p[i]);}}return 0;
}