Question:
Result: 40257
Solve:
这个题还真不太好想,我也看了好多人的题解~
这么一整理之后,就是说只要x2-x1, y2-y1, x2y1-x1y2这三个系数出现不同的状态,就是一条新的直线,那我先把所有的点读入,枚举出所有能构造出的系数,其个数就是答案。
但是还有两个问题
你直接求出的一组系数很可能并不是最简的,需要约去最大公约数,比如2,4,8,你存的时候肯定是以1,2,4去存,要不然后续比对是没办法进行的。
每次构造是以两个点为基础进行的,这两个点构造出的这个系数,别的点可能也能构造出来,所以就需要用到STL的set去重。
至于代码实验:gcd函数不加inline过不去;最后存系数,如果用结构体,得bool判断大小,用ist或者vector更好。
Code:
#include<bits/stdc++.h>
using namespace std;
//最大公约数
inline int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
//点结构
struct Node{
int x;
int y;
}node[450];
//set
set<list<int> >s;
int main(void)
{
int cnt = 0;
//读入点
for(int i = 0; i < 20; i++)
for(int j = 0; j < 21; j++)
{
node[++cnt].x = i;
node[cnt].y = j;
}
//遍历点
for(int i = 0; i <= cnt; i++)
//第二个点没必要从0开始了
for(int j = i + 1; j <= cnt; j++)
{
int x1 = node[i].x, x2 = node[j].x;
int y1 = node[i].y, y2 = node[j].y;
//去掉相同点
if(x1 == x2 && y1 == y2) continue;
//系数计算
int a = y2 - y1;
int b = x1 - x2;
int c = x2 * y1 - x1 * y2;
int gcdn = gcd(a,gcd(b, c));
list<int>l;
l.push_back(a/gcdn);
l.push_back(b/gcdn);
l.push_back(c/gcdn);
s.insert(l);
}
cout <<s.size();
return 0;
}