时间限制:3000ms | 内存限制:65535KB
难度:3
描述
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);
1.按照编号从小到大排序
2.对于编号相等的长方形,按照长方形的长排序;
3.如果编号和长都相同,按照长方形的宽排序;
4.如果编号、长、宽都相同,就只保留一个长方形用于排序,删除多余的长方形;最后排好序按照指定格式显示所有的长方形;
输入
第一行有一个整数 0<n<10000,表示接下来有n组测试数据;
每一组第一行有一个整数 0<m<1000,表示有m个长方形;
接下来的m行,每一行有三个数 ,第一个数表示长方形的编号,
第二个和第三个数值大的表示长,数值小的表示宽,相等
说明这是一个正方形(数据约定长宽与编号都小于10000);
输出
顺序输出每组数据的所有符合条件的长方形的 编号 长 宽
样例输入
1
8
1 1 1
1 1 1
1 1 2
1 2 1
1 2 2
2 1 1
2 1 2
2 2 1
样例输出
1 1 1
1 2 1
1 2 2
2 1 1
2 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;
}
运行时间12,内存308。
收获:人脑思维和电脑的思维方式是很不一样的,很多人脑觉得很容易的事件,电脑处理起来就很复杂(比如用眼睛去判断一个人是谁和用电脑去判断),但也有很多人脑觉得很复杂的事情,电脑处理起来就觉得很轻松(比如大整数的运算)。所以我们需要合理的利用电脑的思维方式去解决我们生活中的难题。作为一个程序员更是要深入了解和运用电脑思维,创造一个一个的奇迹。
分享到:
相关推荐
部编版一年级上册道德与法治《1.开开心心上学去》教案 -1.docx
宝山区《开开心心上学去》(-第二课时)教学设计9页.pdf
倾心推荐,模式识别 感知器学习算法 Widrow-Hoff算法 GUI界面程序 Java代码,可以自己选择样本的坐标(使用者首先在坐标面板上按类别标注点,当单选按钮选择类1时,表示此时标注的属于类1,单选按钮选择类2表示新...
乘法快速心算法15-4-21选编.doc
一年级上册道德与法治课件-1.开开心心上学去-部编版.pdf
一年级上册思品课件-《1-开开心心上学去》1-人教版-(共18张PPT)_精美学习课件ppt
Q学习算法的一个基础例子 可以从这上面进行修改满足自身要求
超棒超快的数学心算法,排序算法数据结构 最快的排序算法
SGK字典学习速率远远优于K-svd算法!
一年级上册道德与法治课件-1《开开心心上学去》 人教部编版.ppt
部编版一年级上册道德与法治《1.开开心心上学去》-教案.docx
Java排序算法实现 Java排序算法实现 Java排序算法实现
2011三下乡备课超棒超快的数学心算法,排序算法数据结构最快的排序算法
主治医师 (内科学)-心血管内科学(A3-A4型题).doc
2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士...
主治医师 (内科学)-心血管内科学(A1-A2型题 1).doc
主治医师 (内科学)-心血管内科学(A1-A2型题 3).doc
主治医师 (内科学)-心血管内科学(A1-A2型题 2).doc
主治医师 (内科学)-心血管内科学(A1-A2型题 4).doc
一年级上册道德与法治《1.开开心心上学去》教学反思(2020—2021学年第一学期).docx