#include <stdio.h>
#include<math.h>
int main()
{
int total=0,i;
float x1=0,y1=20,x2,y2;
float a,c,k[100000]={0},b[100000]={0};
for(;y1>=0;x1++)//x1,y1
{
x1!=19?(x2=x1+1,y2=y1):(x2=0,y2=y1--);
for(;y2>=0;x2++)//x2,y2
{
if(x1==x2)goto x;
a=(y1-y2)/(x1-x2);
c=y1-(a*x1);
total++;
for(i=1;i<=total;i++)//查重
{
if(fabs(k[total]-a)<0.0000001&&fabs(b[total]-c)<0.0000001)
{
total--;
break;
}
}
if (i==total+1)
{
k[total]=a;
b[total]=c;
}
x: if(x2==19)
{
y2--;
x2=-1;
}
}
if(x1==19)
{
y1--;
x1=-1;
}
}
printf("%d",total+19);
return 0;
}
直接求斜率有浮点误差啊
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
vector<pair<int, int> > a;
for(int i=0;i<=19;i++){
for(int j=0;j<=20;j++){
a.push_back(make_pair(i, j));
}
}
set<tuple<int, int, int> > st;
for(auto i : a){
for(auto j : a){
if(i == j) continue;
int x = i.second - j.second;
int y = j.first - i.first;
int z = j.first * i.second - j.second * i.first;
int GCD = __gcd(x, __gcd(y, z));
if(GCD == 0) continue;
st.insert(make_tuple(x / GCD, y / GCD, z / GCD));
}
}
cout << st.size();
return 0;
}