题目描述:
给定一个字母表,求找出可能的划分区域方式,令每个区域内都有等数量的单类型字母。
解题思路:
缩放字母的边界值。最后判断在该字母区域内是否存在其他字母即可。因为表坐标太大,这个题不能用回溯。——注意:边界值缩放时注意=的情况。。。。
代码:
#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;
}