长方形排序

来源:互联网 发布:angularjs保存数据 编辑:程序博客网 时间:2024/04/29 18:56

一种排序

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;

4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;
输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,

第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽
样例输入
181 1 11 1 11 1 21 2 11 2 22 1 12 1 22 2 1
样例输出
1 1 11 2 11 2 22 1 12 2 1
#include <stdio.h>  #include <stdlib.h>    //用结构体保存数据  typedef struct rectangle {       int sequence;       int chang;      int wide;      int flag;  //标记重复的  }RECT;    //排序,这里用交换指针的地址来排序  void paixu( RECT *p,RECT *q)  {      RECT *t;      t=(RECT *)malloc(sizeof(RECT));      *t=*p;      *p=*q;      *q=*t;      free(t);  }    int main()  {      int n,m,i,j,x,y;//中间或临时变量      RECT *Rect[1000];         scanf("%d",&n);      while(n--)      {          scanf("%d",&m);          for(i=0;i<m;i++)          {              Rect[i] = (RECT *)malloc(sizeof(RECT));//动态分配内存用于保存输入的值              scanf("%d %d %d",&Rect[i]->sequence,&x,&y);              if( x > y )   //将大的作为长方形的长              {                  Rect[i]->chang = x;                  Rect[i]->wide = y;              }              else              {                  Rect[i]->chang = y;                  Rect[i]->wide = x;              }                        }          for(i=0;i<m;i++)              Rect[i]->flag = 1;   //标志初始化,默认为没有需要丢弃的          for(i=0;i<m-1;i++)   //循环比较              for(j=i+1;j<m;j++)              {   //前面的序号大,并且没有废弃的数据                  if(Rect[i]->sequence > Rect[j]->sequence && Rect[i]->flag && Rect[j]->flag)                  {                      paixu(Rect[i],Rect[j]);                      continue;                  }                  else if( !Rect[i]->flag ) //如果前面一个数是废弃的数,直接进行下一轮比较                      break;                  else if( ! Rect[j]->flag) //如果后一个数是废弃的数,则跳过去,继续和下一个比较                      continue;                  else if(Rect[i]->sequence == Rect[j]->sequence)  //序号相等时比较长                  {                      if(Rect[i]->chang > Rect[j]->chang)                      {                          paixu(Rect[i],Rect[j]);                          continue;                      }                      else if(Rect[i]->chang == Rect[j]->chang)  //长相等时比较宽                      {                          if(Rect[i]->wide > Rect[j]->wide)                          {                              paixu(Rect[i],Rect[j]);                              continue;                          }                          else if(Rect[i]->wide == Rect[j]->wide )  //宽相等时将其中一个数据废弃                              Rect[i]->flag = 0;                      }                                       }                 }//end for(j=i+1;...)                     for(i=0;i<m;i++)  //输出          {              if( !(Rect[i]->flag) )                  continue;              printf("%d %d %d \n",Rect[i]->sequence,Rect[i]->chang,Rect[i]->wide);          }                for(i=0;i<m;i++)  //释放内存              free(Rect[i]);      }//end while(n--)      return 1;  }  

0 0
原创粉丝点击