当前位置: 代码迷 >> 综合 >> NYOJ - 一种排序
  详细解决方案

NYOJ - 一种排序

热度:69   发布时间:2024-01-20 18:06:07.0

一种排序

时间限制: 3000 ms  |           内存限制: 65535 KB
难度: 3
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

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
#include <stdio.h>struct Rectangle
{int num;int length;int wide;
};void sort(struct Rectangle a[], int n)
{   struct Rectangle tmp;for(int i = 0; i < n-1; i++){for(int j = 0; j < n-1-i; j++){   if(a[j].num != a[j+1].num)     //编号不相同处理 {  if(a[j].num > a[j+1].num){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}else if(a[j].num == a[j+1].num&&a[j].length != a[j+1].length) //编号相同,长度不相同处理 {   if(a[j].length > a[j+1].length){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}else if(a[j].length == a[j+1].length&&a[j].wide != a[j+1].wide)  //编号相同,长度相同,宽度不相同处理 {if(a[j].wide > a[j+1].wide){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;}}}}
}
int main()
{int n,m;struct Rectangle a[1000];scanf("%d",&n);while(n--){scanf("%d",&m);int x,y,z;for(int i = 0; i < m; i++){scanf("%d%d%d",&x,&y,&z);    //注意,当长度比宽度小的时候,将输入的长度与宽度交换 a[i].num = x;a[i].length = y>z?y:z;a[i].wide = y<z?y:z;}sort(a,m);for(int i = 0; i < m; i++)      // 排除排序过后,输出的数据的唯一性 {   int sign = 0;for(int j = 0; j < i; j++){if(a[i].num == a[j].num&&a[i].length == a[j].length&&a[i].wide == a[j].wide)sign = 1;}if(!sign)printf("%d %d %d\n",a[i].num,a[i].length,a[i].wide);}}
}
  相关解决方案