【华为机试题解】直线交点数量

大概题意

输入一行如下格式的字符串

{(0,1),(1,0)}|{(0,5),{5,0)}|{(1,3),(3,1)}

一个大括号中有两个小括号,表示两个点的坐标,即一个大括号可以确定一条直线。那么上述字符串可以表示很多直线,这些直线有交点,求这些交点的个数。
交点坐标很可能是浮点数,浮点数保留小数点后两位,保留采用四舍五入的方式。

思路

解析每一个点,计算每一条直线,算出每一个交点,四舍五入后进行去重,输出不同的交点个数

心情

花了很多时间,就是做不对,总觉得自己没错,考完后,发现,解析字符串的时候傻逼了,居然没有想到系数可能不止1位的情况,比如这样的:

{(0,1),(1,0)}|{(0,12),(222,0)}|{(10,3),(34988,0)}

解析需要针对这种情况加强一下就好使了,难受

代码

#include <bits/stdc++.h>
using namespace std;

struct line{
	int x1;
	int y1;
	int x2;
	int y2;
	double xielv;
	double b;
	double c;
};

struct point{
	double x;
	double y;
};

int main()
{
	struct line lines[100];
	int nums = 0;
	string input;
	cin >> input;
	for(int i = 0; i < input.length(); i++){
		if(input[i] == '{'){
			i = i + 2;
		}
		lines[nums].x1 = 0;
		while(input[i] >= '0' && input[i] <= '9'){
			lines[nums].x1 = lines[nums].x1 * 10 + input[i] - '0';
			i++;
		}
		i = i + 1;
		lines[nums].y1 = 0;
		while(input[i] >= '0' && input[i] <= '9'){
			lines[nums].y1 = lines[nums].y1 * 10 + input[i] - '0';
			i++;
		}
		i = i + 3;
		lines[nums].x2 = 0;
		while(input[i] >= '0' && input[i] <= '9'){
			lines[nums].x2 = lines[nums].x2 * 10 + input[i] - '0';
			i++;
		}
		i = i + 1;
		lines[nums].y2 = 0;
		while(input[i] >= '0' && input[i] <= '9'){
			lines[nums].y2 = lines[nums].y2 * 10 + input[i] - '0';
			i++;
		}
		i = i + 4;
		nums++;
	}
	
//	for(int i = 0; i < nums; i++){
//		cout << lines[i].x1 << " " << lines[i].y1 << " " << lines[i].x2 << " " << lines[i].y2 << endl;
//	}
	
	
	for(int i = 0; i < nums; i++){
		lines[i].xielv = (lines[i].y2 - lines[i].y1) /1.0/ (lines[i].x2 - lines[i].x1);
		lines[i].b = (lines[i].x1 - lines[i].x2) /1.0/ (lines[i].y2 - lines[i].y1);
		lines[i].c = lines[i].y1 * (lines[i].x1 - lines[i].x2) /1.0/ (lines[i].y1 - lines[i].y2) - lines[i].x1;
//		cout << lines[i].b << " " << lines[i].c << endl;
	}
	
	vector<point> points;
	for(int i = 0; i < nums; i++){
		for(int j = i+1; j < nums; j++){
			if(abs(lines[i].xielv - lines[j].xielv) < 0.000001){
				continue;
			}
			else{
				struct point p;
				double b1 = lines[i].b;
				double b2 = lines[j].b;
				double c1 = lines[i].c;
				double c2 = lines[j].c;
				p.y = (c2 - c1) /1.0/ (b1 - b2);
				p.x = 0 - p.y * b1 - c1;
				int tempx = int(p.x * 1000);
				if(tempx % 10 >= 5){
					p.x = int(tempx/10 + 1);
				}
				else{
					p.x = int(tempx/10);
				}
				int tempy = int(p.y * 1000);
				if(tempy % 10 >= 5){
					p.y = int(tempy/10 + 1);
				}
				else{
					p.y = int(tempy/10);
				}
				points.push_back(p);
			}
		}
	}
	
//	for(int i = 0; i < points.size(); i++){
//		cout << points[i].x << " " << points[i].y << endl;
//	}
	
	int ans = 0;
	int diff = 0;
	for(int i = 0; i < points.size(); i++){
		for(int j = i+1; j < points.size(); j++){
			if(points[i].x == points[j].x && points[i].y == points[j].y){
				diff++; 
			}
		}
	}
	
	ans = points.size() - int(sqrt(2*diff));
	cout << ans << endl;

	return 0;
}
发布了164 篇原创文章 · 获赞 26 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u013095333/article/details/91903511