一种排序

来源:互联网 发布:万能mac地址修改器下载 编辑:程序博客网 时间:2024/05/21 10:10
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;


输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等

说明这是一个正方形(数据约定长宽与编号都小于10000);


输出

顺序输出每组数据的所有符合条件的长方形的 编号 长 宽


样例输入
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1


样例输出
1 1 1
1 2 1
1 2 2
2 1 1
2 2 1


这题感觉不难,也没有坑,但是自己可能对cmp函数掌握的不是太好吧,以前总是排序一次就好,这题需要考虑三种情况,而且三种情况都有关联,所以第一时间想到的是写三个cmp函数,cmp1比较编号,cmp2比较长,cmp3比较宽,但后来感觉行不通,这题就先放着的,然后写别的题的时候,看到别人博客上有一题的代码也是用排序,也是需要多种排序,然后才感觉自己考虑问题太复杂了,然后借鉴学习了一下,套用在这题上,原先的排序是:

bool cmp(book m,book n)
{
    if(m.x>n.x)
        return m.x<n.x;
    else
    {
        if(m.length>n.length)
            return m.length<n.length;
        else
            return m.wide<n.wide;
    }
}

测试数据过了,自己也感觉没错但还是wa了,其实我这还是证明我对这个函数的排序理解的不透彻,重新改了一下,详情见下面代码部分,为了更好的理解这个函数,我特别请教了一个大神,让他给我想两组数据,帮我理解,这两组数据在这里和大家分享一下,有和我一样不太理解的,可以自己测试理解一下。

433 1 12 2 21 3 331 3 11 2 21 1 3

#include <iostream>

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct book{
    int length,wide,x;
}s[1010];//定义一个结构体,存储每个长方形的信息,为了方便后面排序
bool cmp(book m,book n)//排序,自己结合上面有bug的函数理解一下
{
    if(m.x!=n.x)
        return m.x<n.x;
    else
    {
        if(m.length!=n.length)
            return m.length<n.length;
        else
            return m.wide<n.wide;
    }
}
int main()
{
    int a,b,i,t;
    scanf("%d",&a);
    while(a--)
    {
        scanf("%d",&b);
        for(i=0;i<b;i++)
        {
            scanf("%d %d %d",&s[i].x,&s[i].length,&s[i].wide);
            if(s[i].length<s[i].wide)//同一每组的长宽的位置
            {
                t=s[i].length;
                s[i].length=s[i].wide;
                s[i].wide=t;
            }
        }
        sort(s,s+b,cmp);//排好序
        for(i=0;i<b;i++)
        {//如果此长方形和下一个长方形的信息都一样,则不输出这个
            if((s[i].x==s[i+1].x)&&(s[i].length==s[i+1].length)&&(s[i].wide==s[i+1].wide))
                continue;
            else
                printf("%d %d %d\n",s[i].x,s[i].length,s[i].wide);
        }
    }
    return 0;
}

原创粉丝点击