18_1

Posted sybil-hxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了18_1相关的知识,希望对你有一定的参考价值。

一、收获:

1.qsort函数对数组、结构体等进行排序

#include <stdlib.h>//必须用stdlib.h,没用.h不用namespace不行

参数:1待排序数组首地址 2数组中待排序元素数量 3各元素的占用空间大小 4指向函数的指针,用于确定排序的顺序

eg:

(1)重写cmp,固定参数,变化的只是比较内容

int cmp(const void *a,const void *b){
return (*(XianDuan*)b).xd_num - (*(XianDuan*)a).xd_num;

}

此处为降序,后者大于前者时,交换位置;a-b为升序

此处(*(XianDuan*)b).xd_num进行强转时,最前面的*不能丢,因为这里用的是指针而非引用,*b表示访问其值

(2)调用qsort函数

qsort(xd,num,sizeof(struct XianDuan),cmp);

2.使用freopen输入重定向,输入数据将从in.txt文件中读取

freopen("G:/in.txt","r",stdin); 

必须使用using namespace std;否则不能使用

3.两处算法问题

if(i != j && xd[i].b_x == xd[j].a_x && xd[i].b_y == xd[j].a_y){
xd[i].b_x = xd[j].b_x;
xd[i].b_y = xd[j].b_y;
xd[i].xd_num += xd[j].xd_num;//此处也不是+1,而是两个长度相加
}else if(i != j && xd[j].b_x == xd[i].a_x && xd[j].b_y == xd[i].a_y){//只有上面if没有遍历完全,必须再反过来测试,否则会丢失“1 7 2 5”这一段
xd[j].b_x = xd[i].b_x;
xd[j].b_y = xd[i].b_y;
xd[j].xd_num += xd[i].xd_num;
}

二、题目

/*
第一题

给若干条线段,线段的右点的横坐标必然比左点的横坐标大,第一行输入n,以后输入n行,每行为左右点的横纵坐标,
一些线段可以连在一起,输出连在一起的大线段最多有多少条线段,以及该大线段的起点

一条线段有a b两端点,a坐标为(a-x,a-y),b坐标为(b-x,b-y),且b点x坐标一定大于a点x坐标。给出若干个线段,
收尾相同的线段可以相连(不会形成环),请输出可以组成线段,中包含线段最多的个数,以及合并后的起点坐标。

输入格式:线段个数,每行为线段坐标。
输出格式:最大线段数,线段起点
样例输入:

6
0 2 1 7
2 5 9 6
3 4 7 8
9 6 11 12
7 9 10 19
1 7 2 5

样例输出:
402

*/

三、思路

1.把数据读入

2.合并首尾相连的线段,并且对线段数求和(五星)

3.排序,按要求输出最长的那个

四、代码

#include <iostream>
#include <stdlib.h>//qsort参数:1待排序数组首地址 2数组中待排序元素数量 3各元素的占用空间大小 4指向函数的指针,用于确定排序的顺序
using namespace std;

struct XianDuan{
int a_x;
int a_y;
int b_x;
int b_y;
int xd_num;//你的数据结构没有新线段中原始线段条数,缺乏一个合并的过程,怪不得没法处理
};

int cmp(const void *a,const void *b){
return (*(XianDuan*)b).xd_num - (*(XianDuan*)a).xd_num;

}

void main(){
freopen("G:/in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
int num;
cin>>num;
XianDuan *xd = new XianDuan[num];
for(int i=0;i<num;i++){
cin>>xd[i].a_x>>xd[i].a_y>>xd[i].b_x>>xd[i].b_y;
xd[i].xd_num = 1;//忘记初始化
if(xd[i].a_x >= xd[i].b_x){
cout<<"不满足:右点的横坐标比左点的横坐标大!"<<endl;
delete[] xd;
exit(0);
}
}

for(i=0;i<num;i++){
for(int j=0;j<num;j++){
if(i != j && xd[i].b_x == xd[j].a_x && xd[i].b_y == xd[j].a_y){
xd[i].b_x = xd[j].b_x;
xd[i].b_y = xd[j].b_y;
xd[i].xd_num += xd[j].xd_num;//此处也不是+1,而是两个长度相加
}else if(i != j && xd[j].b_x == xd[i].a_x && xd[j].b_y == xd[i].a_y){//只有上面if没有遍历完全,必须再反过来测试
xd[j].b_x = xd[i].b_x;
xd[j].b_y = xd[i].b_y;
xd[j].xd_num += xd[i].xd_num;
}
}
}

qsort(xd,num,sizeof(struct XianDuan),cmp);
cout<<xd[0].xd_num<<xd[0].a_x<<xd[0].a_y<<endl;

delete[] xd;

}

 



























































以上是关于18_1的主要内容,如果未能解决你的问题,请参考以下文章

18.3.2从Class上获取信息(方法)

Java VM:1.6.0_17 和 1.6.0_18 上的可重现 SIGSEGV,如何报告?

虚拟机+Ubuntu18.04+CoppeliaSim

学习总结2019.4.18

18_1

python——函数18迭代器