题意:输入K和P,K表示有几种字母,也就是输入有几行,p表示每种字母有几个,是以坐标的形式出现的(x,y),现在让我们将相同的字母划分在一个矩形块中,使每个矩形都不重合,问能否实现。
输入:输入测试的组数t,再给出每一组的字母种数K,每个字母的坐标数P,最后一次输入每种字母的P个坐标。
输入:输入测试的组数t,再给出每一组的字母种数K,每个字母的坐标数P,最后一次输入每种字母的P个坐标。
输出:能满足要求的测试数据就输出YES,否则输出NO。
具体做法如下
1.首先申请4个数组,l[K]、r[K]、u[K]、d[K]表示左右上下用来确定一个长方形。对第i种字母,每一行取x的最小值存入l[i],x的最大值存入r[i],y的最小值存入u[i],y的最大值存入d[i]。
2.对这K个长方形进行扩充,只要满足
l[i] < r[j] && l[i] > l[j],则l[i] = l[j];
r[i] < r[j] && r[i] > l[j],则r[i] = r[j];
u[i] < d[j] && u[i] > u[j],则u[i] = u[j];
d[i] < d[j] && d[i] > u[j],则d[i] = d[j];
3.判断这k个矩形有没有相同的,如果有则输出NO,没有则输出YES。
/*相同的字母可以看成是一个长方形或正方形,
**那么每一个测试用例分别就有K个单独长方形了。
**每个长方形在满足一定的条件下进行扩充,最后得到的K个长方形,
**如果其中没有相同的就输出YES,否则就输出NO。
**C++版
*/
#include <iostream>
#define MAX 10001
#define min(a,b) a < b ? a : b
#define max(a,b) a < b ? b : a
using namespace std;
int l[27], r[27], u[27], d[27];
int k, p;//k表示the number of different letters, p 表示the number of instances of each letter.
int judge()
{
int i, j;
for(i = 0; i < k; i++)
{
for(j = i + 1; j < k; j++)
{
if(l[i] == l[j] && r[i] == r[j] && u[i] == u[j] && d[i] == d[j])
return 0;
}
}
return 1;
}
int main()
{
int i, j, n; //n表示测试组数
int x, y;
cin >> n;
while(n--)
{
cin >> k >> p;
for(i = 0; i < 27; i++)
{
l[i] = MAX; u[i] = MAX;
r[i] = 0; d[i] = 0;
}
for(i = 0; i < k; i++)
{
for(j = 0; j < p; j++)
{
cin >> x >> y;
l[i] = min(l[i], x - 1); r[i] = max(r[i], x);
u[i] = min(u[i], y - 1); d[i] = max(d[i], y);
}
}
//构造k个正方形
for(i = 0; i < k; i++)
{
for(j = 0; j < k; j++)
{
if(i != j)
{
if(l[i] < r[j] && l[i] > l[j])
l[i] = l[j];
if(r[i] < r[j] && r[i] > l[j])
r[i] = r[j];
if(u[i] < d[j] && u[i] > u[j])
u[i] = u[j];
if(d[i] < d[j] && d[i] > u[j])
d[i] = d[j];
}
}
}
if(judge())
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}