一种排序
时间限制:
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); } } }
-
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;