NYOJ 8 一种排序 快排 去重
思路:用节点表示长方形的编号,长宽和tag(用来去重的标记,默认为1,重复的标记为0)
难点:先按编号快排,再去重.
附ac代码
#include <stdio.h> #include <stdlib.h> struct Node{ int num, len, wid, tag; }; bool compare(Node a, Node b){ if(a.len == b.len && a.wid == b.wid) return true; return false; } int cmp(const void *a, const void *b){ if((*(Node *)a).num - (*(Node *)b).num < 0 || (*(Node *)a).num - (*(Node *)b).num == 0 && (*(Node *)a).len - (*(Node *)b).len < 0 || (*(Node *)a).num - (*(Node *)b).num == 0 && (*(Node *)a).len - (*(Node *)b).len == 0 && (*(Node *)a).wid - (*(Node *)b).wid < 0) return -1; return 1; } int main(){ int t, n, temp; scanf("%d", &t); while(t-- && scanf("%d", &n)){ Node *a = (Node *)malloc(sizeof(Node) * n); //接受输入并保证长大于等于宽 for(int i = 0; i != n; ++i){ scanf("%d%d%d", &a[i].num, &a[i].len, &a[i].wid); a[i].tag = 1; if(a[i].len < a[i].wid) temp = a[i].len, a[i].len = a[i].wid, a[i].wid = temp; } //排序 qsort(a, n, sizeof(Node), cmp); //去重 for(int i = 0; i != n; ++i){ if(!a[i].tag) continue; for(int j = i + 1; j != n && a[j].num == a[i].num; ++j) if(compare(a[i], a[j])) a[j].tag = 0; } //输出 for(int i = 0; i != n; ++i) if(a[i].tag) printf("%d %d %d\n", a[i].num, a[i].len, a[i].wid); free(a); } return 0; }