#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;
}
一种排序《长方形》
最新推荐文章于 2021-05-24 06:54:50 发布