这道题在分类中属于 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;
- }
来源: http://www.bubuko.com/infodetail-2535897.html