poj - 1231 题解

题目大意:在一个二维平面上放一些字母。每个字母数量相同,问能否画一些划分二维平面的直线,使得相同字符全部分布在一个区域,且该区域仅有这一种字符。

题解:首先我们定义l,r,u,d四个数组,分别表示对某一个字符划分区域的左、右、上、下边界。然后分别对四个数组进行扩展:如果一个字符的左边界被包含在另一个字符的区域内,那么这个左边界就更新为包含区域的左边界,其他也相同。最后检查一遍两条坐标轴,如果存在左右边界交错的情况且上下边界也交错,这就是不能画的情况。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<climits>
  4 using namespace std;
  5 int l[30],r[30],u[30],d[30];
  6 bool judge_x(int x,int y)
  7 {
  8     if(l[x]>=l[y]&&l[x]<=r[y])
  9     {
 10         return true;
 11     }
 12     if(r[x]>=l[y]&&r[x]<=r[y])
 13     {
 14         return true;
 15     }
 16     return false;
 17 }
 18 bool judge_y(int x,int y)
 19 {
 20     if(d[x]>=d[y]&&d[x]<=u[y])
 21     {
 22         return true;
 23     }
 24     if(u[x]>=d[y]&&u[x]<=u[y])
 25     {
 26         return true;
 27     }
 28     return false;
 29 }
 30 int main()
 31 {
 32     int T;
 33     cin>>T;
 34     for(int t=1;t<=T;t++)
 35     {
 36         int n,m;
 37         cin>>n>>m;
 38         for(int i=1;i<=n;i++)
 39         {
 40             l[i]=INT_MAX;
 41             r[i]=0;
 42             d[i]=INT_MAX;
 43             u[i]=0;
 44             for(int j=1;j<=m;j++)
 45             {
 46                 int x,y;
 47                 cin>>x>>y;
 48                 l[i]=min(l[i],x);
 49                 r[i]=max(r[i],x);
 50                 u[i]=max(u[i],y);
 51                 d[i]=min(d[i],y);
 52             }
 53         }
 54         for(int i=1;i<=n;i++)
 55         {
 56             for(int j=1;j<=n;j++)
 57             {
 58                 if(i==j)
 59                 {
 60                     continue;
 61                 }
 62                 if(l[i]>=l[j]&&l[i]<=r[j])
 63                 {
 64                     l[i]=l[j];
 65                 }
 66                 if(r[i]>=l[j]&&r[i]<=r[j])
 67                 {
 68                     r[i]=r[j];
 69                 }
 70                 if(d[i]>=d[j]&&d[i]<=u[j])
 71                 {
 72                     d[i]=d[j];
 73                 }
 74                 if(u[i]>=d[j]&&u[i]<=u[j])
 75                 {
 76                     u[i]=u[j];
 77                 }
 78             }
 79         }
 80         bool flag=true;
 81         for(int i=1;i<=n&&flag;i++)
 82         {
 83             for(int j=1;j<=n;j++)
 84             {
 85                 if(i==j)
 86                 {
 87                     continue;
 88                 }
 89                 if(judge_x(i,j)&&judge_y(i,j))
 90                 {
 91                     flag=false;
 92                     break;
 93                 }
 94             }
 95         }
 96         if(flag)
 97         {
 98             cout<<"YES"<<endl;
 99         }
100         else
101         {
102             cout<<"NO"<<endl;
103         }
104     }
105     return 0;
106 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值