这道题在分类中属于STL,写了两种解法
1、很容易直接想到三层遍历进行排序,我写得比较暴力,时间消耗较大,不推荐
#include <iostream> using namespace std; struct Rect{ int id,a,b; }f[1001]; int main() { int n; cin>>n; while(n--){ int m; cin>>m;
//输入 for(int i=0;i<m;i++){ cin>>f[i].id>>f[i].a>>f[i].b; if(f[i].a<f[i].b){ int temp = f[i].a; f[i].a = f[i].b; f[i].b = temp; } }
//排序 for(int i=0;i<m;i++){ for(int j = i+1;j<m;j++){ if(f[i].id>f[j].id){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; }else if(f[i].id==f[j].id&&f[i].a>f[j].a){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; }else if(f[i].id==f[j].id&&f[i].a==f[j].a&&f[i].b>f[j].b){ rtg temp = f[i]; f[i] = f[j]; f[j] = temp; } } }
//标记去重 for(int i=0;i<m;i++){ for(int j = i+1;j<m;j++){ if(f[i].id==f[j].id){ if(f[i].a==f[j].a){ if(f[i].b==f[j].b){ flag[j] = 1; } } } } } for(int i=0;i<m;i++){ if(flag[i]==0){ cout<<f[i].id<<" "<<f[i].a<<" "<<f[i].b<<endl; } } } return 0; }
2、用到set,set好处是没有重复元素和内部有序,这两点都符合题意
#include <iostream> #include<set> using namespace std; struct Rect{ int id,a,b;
//运算符重载 bool operator <(const Rect& r)const{ return this->id != r.id ? this->id < r.id : (this->a != r.a ? this->a < r.a : this->b < r.b); } }; set<Rect> s; int main() { int n,id,a,b; Rect r; cin>>n; while(n--){ int m; cin>>m; s.clear(); while(m--){ cin>>id>>a>>b; if(a<b){ swap(a,b); } Rect r; r.id = id,r.a = a;r.b = b; s.insert(r); } set<Rect>::iterator iter = s.begin(); while(iter!=s.end()){ cout<<iter->id<<" "<<iter->a<<" "<<iter->b<<endl; iter++; } } return 0; }