一、收获:

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表示访问其值,另外:使用void* (void指针)类型,在给指针赋值时,必须把void指针强制转换为所需要类型的指针以保证赋值的正常进行。(void*见:https://www.cnblogs.com/sybil-hxl/p/10422649.html

(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;
}    

 

posted on 2019-02-22 23:01  西伯尔  阅读(361)  评论(0)    收藏  举报