解法:
平面直角坐标系上的两个点可以确定一条直线,进而根据坐标可以确定直线方程y=kx+b
统计不同直线的数量即不同{k,b}数据对的数量
答案是:40257
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
set<pair<double,double>> hash;
//求出关于直线的数据对{k,b};
//求出y=kx+b
for(int x1=0;x1<20;x1++)
{
for(int y1=0;y1<21;y1++)
{
for(int x2=x1+1;x2<20;x2++)//注意考虑x2=x1+1,保证效率存在的时候统计直线
{
for(int y2=0;y2<21;y2++)
{
//求k 和 b
//k=(y2-y1)/(x2-x1)
double k=(double)(y2-y1)/(x2-x1);
//求b就要注意精度问题
//b=y-kx=y2-(y2-y1)/(x2-x1)*x2 这样先除后乘,让精度损失范围扩大
//化简成一个除法 b=(y1*x2-y2*x1)/(x2-x1)
double b=(double)(y1*x2-y2*x1)/(x2-x1);
hash.insert({k,b});
}
}
}
}
//最后一定要加上斜率不存在的时候横坐标就是列的个数一共有20列
cout<<hash.size()+20;//40257
return 0;
}
注意考虑x2=x1+1,保证效率存在的时候统计直线
最后一定要加上斜率不存在的时候横坐标就是列的个数一共有20列
其实不难,但是我第一次写的时候还是没能写出来