poj_1231_搜索?

题目描述:

   给定一个字母表,求找出可能的划分区域方式,令每个区域内都有等数量的单类型字母。

 

解题思路:

   缩放字母的边界值。最后判断在该字母区域内是否存在其他字母即可。因为表坐标太大,这个题不能用回溯。——注意:边界值缩放时注意=的情况。。。。

 

代码:

#include <stdio.h>
#include <stdlib.h>
#define N 27

typedef struct{
   int x;
   int y;
}LETTER;

LETTER letter[N][11];
int l[N],r[N],u[N],d[N],k,p;

int judge()
{
   int i,j,t;
   for(i=1;i<=k;i++)
      for(j=1;j<=k;j++)
         if(i!=j)
         {
            for(t=1;t<=p;t++)
               if(letter[j][t].x >= u[i] && letter[j][t].x <= d[i])
                  if(letter[j][t].y >= l[i] && letter[j][t].y <= r[i] )
                     return 0;
         }
   return 1;
}

main()
{
   int t,i,j;
    scanf("%d",&t);
    while(t>0)
    {
       t--;
       memset(l,127,sizeof(l));//设大
       memset(r,0,sizeof(l));
       memset(u,127,sizeof(l));//设大
       memset(d,0,sizeof(l));
       scanf("%d %d",&k,&p);
       for(i=1;i<=k;i++)
       {
          for(j=1;j<=p;j++)
          {
             scanf("%d %d",&letter[i][j].x,&letter[i][j].y);
             if(letter[i][j].x < u[i])
                u[i] = letter[i][j].x;
             if(letter[i][j].x > d[i])
                d[i] = letter[i][j].x;

             if(letter[i][j].y < l[i])
                l[i] = letter[i][j].y;
             if(letter[i][j].y > r[i])
                r[i] = letter[i][j].y;         
          }
      }
      //整体缩放
      for(i=1;i<=k;i++)
      {
         for(j=1;j<=k;j++)
         {
            if(i != j)
            {
               if(l[i] > l[j] && l[i] <= r[j])
                  l[i] = l[j];
               if(r[i] >= l[j] && r[i] < r[j])
                  r[i] = r[j];
               if(u[i] > u[j] && u[i] <= d[j])
                  u[i] = u[j];
               if(d[i] >= u[j] && d[i] < d[j])
                  d[i] = d[j]; 
            }
         }
         //printf("node%d: l[%d],r[%d],u[%d],d[%d].\n",i,l[i],r[i],u[i],d[i]);
      }
      //检查是否合格
      if(judge() == 0)
          printf("NO\n");
      else
         printf("YES\n");
     
   }
   //system("pause");
   return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值