POJ1231The Alphabet Game

题意:输入K和P,K表示有几种字母,也就是输入有几行,p表示每种字母有几个,是以坐标的形式出现的(x,y),现在让我们将相同的字母划分在一个矩形块中,使每个矩形都不重合,问能否实现。

输入:输入测试的组数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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值