ACM第十六题思考及解答

来源:互联网 发布:java小型超市管理系统 编辑:程序博客网 时间:2024/06/18 11:36

题目如下:

矩形嵌套

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入
第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
输出
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
样例输入
1101 22 45 86 107 93 15 812 109 72 2
样例输出
5

解题思路:

主要核心思想:寻找所有的矩形中最小的一个与存储的矩形逐一嵌套对比可以嵌套计数器加一即可。

看完题目脑袋自动脑补为啥要旋转90度,考虑那么复杂,无论你输入多少,长大于宽或者宽大于长,我直接定制一个格式,最后输出的都是长大于宽(我存储的也是长一定大于等于宽),可以规避旋转问题。

接下来主要思路,就是设置所有的矩形中最小的为初始比较值,每次存储的时候和上一次初始比较值进行比较,比之前存储的小的就替换,大的则跳过,依次可以存储到最小的一个值,这样的目的是为了以后寻找最多可以嵌套多少个矩形做准备。

代码如下:

#include<stdio.h>

typedef struct chang
{
    int a;//chang
    int b;//kuan
}ch;
void swap(int *p1,int *p2)
{
    int temp=0;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
//static int count=0;
int qiantao(int num1,int buf1[100][3],int lenmin,int widmin)
{
    int k=0,count=0;
    for(k=0;k<num1;k++)
    {

    if((buf1[k][0]>lenmin)&&(buf1[k][1]>widmin))
    {
       count++;
    }
    }
    return count;
}
int buf[100][3]={};

int main()
{
    ch c;
    int num=0,i=0;
    int lenmin=0,widmin=0;
    int num1=0,j=0,count1=0;
    printf("please input num about testing groups!\n");
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
   printf("please input no.%d group num1 about testing rectangle\n",i+1);
      scanf("%d",&num1);
     for(j=0;j<num1;j++)
     {
         printf("please input no.%d rectangle a(length) and b(width)\n",j+1);
         scanf("%d,%d",&c.a,&c.b);
         if(c.a<c.b)
         {swap(&c.a,&c.b);};
         buf[j][0]=c.a;
         buf[j][1]=c.b;
         lenmin=buf[0][0];
         widmin=buf[0][0];
         if((buf[j][0]<lenmin)&&(buf[j][1])<widmin)
         {
             lenmin=buf[j][0];
             widmin=buf[j][1];
        // swap(&buf[j][0],&lenmin);
        // swap(&buf[j][1],&widmin);
         }
     }
    count1=qiantao(num1,buf,lenmin,widmin);
    }
    for(i=0;i<num;i++)
    {
    for(j=0;j<num1;j++)
    {
       printf("groups=no.%d,num1=%d,length=%d,width=%d\n",i+1,j+1,buf[j][0],buf[j][1]);
    }
    printf("the suitable a and b is=%d\n",count1);
    }
    return 0;
}
1 0
原创粉丝点击