在矩阵中不同直线个数的求法

蓝桥杯12届B组题C的疑问,在20行,19列的整数坐标轴上,任意两点相连构成一条直线,问不同的直线有几条。
#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;
 } 
求得结果为43928,参考答案为40257
遍历所有两点,通过计算斜率a与常数项c来判断直线是否相同,
我想要达到的结果

直接求斜率有浮点误差啊


#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;
}