矩阵的嵌套问题(nylgoj)
问题描述:
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
# define maxn 1000
int cmp(const void *a,const void *b)
{
int* c = (int *)a;
int* d = (int *)b;
if(*c != *d)
return *c - *d;
return *(d+1) - *(c+1);
}//这里是个排序函数,将第一列按照升序,第二列按照降序的方式排列的。
int main()
{
int a[maxn+10][3];
int b[maxn+10];
int t,n,i,j,temp;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i][0],&a[i][1]);
if(a[i][0] > a[i][1])
{
temp = a[i][0];
a[i][0] = a[i][1];
a[i][1] =temp;
}
}
qsort(a,n,sizeof(a[0]),cmp);
int max=0;
for(i=0;i<n;i++)
{ max = 0;
for(j=i-1;j>=0;j--)
{
if(a[j][1]<a[i][1] && b[j]>max)
max = b[j];
}
b[i] = max + 1;
}//这个for循环其实就是记录性的,他每个单元里面记录了已经升序的个数
printf("*******************************\n");
for(i=0;i<n;i++)
printf("%d %d\n",a[i][0],a[i][1]);
printf("\n");

浙公网安备 33010602011771号