数据结构-连续线段-C语言-[输入n条线段各个端点坐标,求包含最多线段的连续线段]
连续线段题目描述题目分析实现思路代码实现题目描述平面上两个点(一个点由(x,y)坐标组成)可构成一个线段,两个线段如果有一个端点相同,则可构成一个连续线段。假设构成线段的两个端点为v1(x1,y1)和v2(x2,y2),在此满足x1<x2,其中v1称为线段的起点,v2为线段的终点。同样,对于连续线段来说,在此满足xi<xi+1(i=1…n-1,n为连续线段中的端点数,xi为相应端点的X
题目描述
平面上两个点(一个点由(x,y)坐标组成)可构成一个线段,两个线段如果有一个端点相同,则可构成一个连续线段。假设构成线段的两个端点为v1(x1,y1)和v2(x2,y2),在此满足x1<x2,其中v1称为线段的起点,v2为线段的终点。同样,对于连续线段来说,在此满足xi<xi+1(i=1…n-1,n为连续线段中的端点数,xi为相应端点的X轴坐标)。输入一组线段(用两个端点的x、y坐标表示线段,线段个数大于等于2,小于等于100),编程计算出连续线段中包含最多线段数的线段,输出相应的线段数和起点位置(注意,不是最长的连续线段,是包含最多线段的连续线段)。例如:
上图中有10个线段,其中5、10、4号线段连成了一条连续线段,线段数3条,起点位置为5号线段的左端点;6、8、2、3、9号线段连成了另一条连续线段,该连续线段包含的线段数最多,为5条,起点位置是6号线段的左端点。
注意:
1)不考虑线段中间相交的情况;
2)不会有三条或三条以上的线段共一个端点;
3)只会出现一条包含最多线段的连续线段;
【输入形式】
先从控制台输入线段数,然后从下一行开始分行输入各线段两个端点的x、y坐标,其中第一个端点的X轴坐标小于第二个端点的X轴坐标,即x1<x2,x、y坐标都用整数表示,不会超过int的表示范围。各整数坐标值间以一个空格分隔。
【输出形式】
先在控制台输出包含最多线段数的连续线段的线段数,然后输出连续线段的起点的x、y坐标,输出数据都以一个空格分隔。
【样例输入】
10
80 75 125 75
60 40 80 55
80 55 90 20
140 120 195 205
10 111 70 165
22 35 43 43
22 175 80 205
43 43 60 40
90 20 125 60
70 165 140 120
【样例输出】
5 22 35
【样例说明】
输入了十个线段,第一个线段两个端点分别为(80,75)和(125,75),其它线段类似,如上图所示,这些线段所构成的连续线段中包含最多线段数的连续线段的线段数为5,起点为(22,35),所以输出:5 22 35。
题目分析

实现思路
- 存储输入线段个数、坐标信息
- 从输入线段起终点坐标,寻找连续线段的起点,存储
- 根据起点坐标,寻找连续线段的终点坐标,并为每条连续线段的线段个数计数,存储
- 根据存储的每条线段个数,寻找包含最多线段的连续线段
- 打印结果
代码实现
#include <stdio.h>
#include <string.h>
struct L
{ //线段
int x1; //起点
int y1;
int x2; //终点
int y2;
int num; //线段个数
};
int main()
{
int i = 0, j = 0, n = 0, k = 0, isl = 0, max = 0, res = 0;
// n为线段个数,isl判断中间点坐标,max最大长度,返回第res+1的连续线段
int Ps[100][4];
struct L arr[100];
//输入信息,存储坐标存储
while (n < 2 || n > 100)
{ //2<=n<=100
scanf("%d", &n); //线段个数
}
for (i = 0; i < n; i++)
{
while (Ps[i][0] >= Ps[i][2])
{ //x1<x2
scanf("%d%d%d%d", &Ps[i][0], &Ps[i][1], &Ps[i][2], &Ps[i][3]);
}
}
//找起点
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j)
continue;
if (Ps[i][0] == Ps[j][2] && Ps[i][1] == Ps[j][3])
{
isl = 1;
break;
}
}
if (isl == 0)
{
arr[k].x1 = Ps[i][0];
arr[k].y1 = Ps[i][1];
arr[k].x2 = Ps[i][2];
arr[k].y2 = Ps[i][3];
k++;
}
isl = 0;
}
//找终点
for (i = 0; i < k; i++)
{
arr[i].num = 1;
for (j = 0; j < n; j++)
{
if (arr[i].x2 == Ps[j][0] && arr[i].y2 == Ps[j][1])
{
arr[i].x2 = Ps[j][2];
arr[i].y2 = Ps[j][3];
arr[i].num++;
j = -1;
}
}
}
//找最长
for (i = 0; i < k; i++)
{
if (max < arr[i].num)
{
max = arr[i].num;
res = i;
}
}
printf("%d %d %d\n", arr[res].num, arr[res].x1, arr[res].y1);
return 0;
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)