一種排序
時間限制: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 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
樣例輸出
//這裡我用了泛型算法裡面的qsort函數,在頭檔案<algorithm>中
隻要排好,在輸出的時候把重複的不輸出就可以了
代碼如下:
#include <iostream>
#include <algorithm>
using namespace std;
struct square
{
public:
int no;//編号
int length;//長
int width;//寬
};
int cmp(const void *p, const void *q)
square *s = (square *)(p);
square *s1 = (square *)(q);
if (s->no != s1->no)
return s->no - s1->no > 0 ? 1 : -1;
else
if (s->length != s1->length)
return s->length - s1->length >0 ? 1 : -1;
if (s->width != s1->width)
return s->width - s1->width > 0 ? 1 : -1;
}
int main()
int n;
cin >> n; //n組測試資料
for (int test = 1; test <= n; test++)
int m;
cin >> m;//m個正方形
int a, b;
square *s = new square[m];
for (int i = 0; i < m; i++)
//*******************************
cin >> s[i].no >> a >> b;
if (a > b)
s[i].length = a;
s[i].width = b;
s[i].length = b;
s[i].width = a;
qsort(s, m, sizeof(s[0]), cmp);
cout << s[0].no << " " << s[0].length << " "
<< s[0].width << endl;
for (int i = 1; i < m; i++)
if (s[i].no == s[i-1].no && s[i].length == s[i-1].length
&& s[i].width == s[i-1].width)
continue;
cout << s[i].no << " " << s[i].length << " "
<< s[i].width << endl;
delete [] s;
return 0;