北航计算机2018年复试-机试第1题

北航计算机2018年复试-机试第1题

题目

在直角坐标系中有若干线段,有的线段会和其他线段的某一段重合,即某一端点坐标相同;这些线段会形成含有两条或两条以上线段的折线,求若干折线中含有线段最多的数目,输出,并输出折线最左端的坐标。

暴力代码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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值