nyoj 8 一種排序

ACM_e發表於2017-08-31

一種排序

時間限制: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<bits/stdc++.h>
//#include<set>
using namespace std;
struct ac{
   int x,y,z,k;
}a[10001];
bool cmp(struct ac q,struct ac w){
   if(q.x!=w.x)
      return q.x<w.x;
   else if(q.y!=w.y)
      return q.y<w.y;

   return q.z<w.z;
}
int main(){
   int n;
     cin>>n;
   while(n--){
     //set<ac>a[1001];
      int m;
        cin>>m;
      int l=0;
      for(int j=0;j<m;j++){
         int x1,x2,x3;
           cin>>x1>>x2>>x3;
        // bool b=0;
         if(x2<x3) {
            swap(x2,x3);
           // b=1;
         }
         bool s=1;
         for(int i=0;i<l;i++){
            if(a[i].y==x2&&a[i].z==x3){
               if(a[i].x==x1){
                s=0;
                break;
               }
            }
         }
         if(s){
            a[l].x=x1;
            a[l].y=x2;
            a[l].z=x3;
           // if(b) a[l].k=1;
            l++;

         }
        // cout<<" 1"<<a[l-1].x<<" "<<a[l-1].y<<" "<<a[l-1].z<<endl;

      }
      sort(a,a+l,cmp);
      for(int j=0;j<l;j++){
         //if(a[j].k) swap(a[j].y,a[j].z);
         cout<<a[j].x<<" "<<a[j].y<<" "<<a[j].z<<endl;
      }
   }

   return 0;
}


相關文章