矩阵的嵌套问题(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");

 

 

posted @ 2012-05-07 22:55  coodle  阅读(811)  评论(0)    收藏  举报