题目
在直角坐标系中有若干线段,有的线段会和其他线段的某一段重合,即某一端点坐标相同;这些线段会形成含有两条或两条以上线段的折线,求若干折线中含有线段最多的数目,输出,并输出折线最左端的坐标。
暴力代码c++/c
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX = 10001;
struct Line{
int x1,y1,x2,y2;
int index;
int segnum;
}line[MAX];
bool cmp(Line a, Line b) {
if(a.segnum == b.segnum) return a.index < b.index;
else return a.segnum > b.segnum;
}
queue<Line> q;
//vector<Line> MaxLine;
int main() {
int n;
cin >> n;
int i,j;
for(i = 0; i < n; ++i) {
cin >> line[i].x1 >> line[i].y1 >> line[i].x2 >> line[i].y2;
line[i].index = i;
line[i].segnum = 1;
}
for (i = 0; i < n; ++i) { // 以没个线段为起点进行遍历
while(!q.empty()) { // 清空queue
q.pop();
}
q.push(line[i]);
int MaxSegNum = line[i].segnum; // 记录以当前选段起点时的最大线段数
while(!q.empty()){
int size = q.size();// 记录当前层的个数
while(size--) {
Line curline = q.front();
q.pop();
// 记录最大maxsegnum
if(MaxSegNum < curline.segnum) MaxSegNum = curline.segnum;
for (int j = 0; j < n; ++j) {
Line nextline = line[j];
nextline.segnum = curline.segnum + 1;
// nextline.segnum
if (curline.index != j) { // 同一条线段
if (curline.x2 == nextline.x1 && curline.y2 == nextline.y1){ // 首尾相接
q.push(nextline);
}
}
}
}
}
line[i].segnum = MaxSegNum; // 记录以当前线段为起点的折线长度
}
sort(line, line+n, cmp);
cout << line[0].x1 << " " << line[0].y1 << endl;
cout << line[0].segnum<<endl;
return 0;
}
测试用例
9
1 1 2 2
0 0 2 2
0 0 1 1
2 2 3 3
2 2 4 4
4 4 5 5
3 3 5 5
5 5 6 6
3 3 7 7