大概题意
输入一行如下格式的字符串
{(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;
}