暴力解法。一条直线可以用斜率和过直线的点确定。
#include<iostream>
using namespace std;
//zx[x][y][i][j]=1表示斜率为x/y、过点(i,j)的直线已存在。
int zx[20][20][25][25];
//最大公约数求斜率分母分子
void dw(int a,int b,int &x,int &y)
{
int a0 = a>b?a:b;
int b0 = a>b?b:a;
while(a0%b0!=0)
{
int t = a0;
a0 = b0;
b0 = t%b0;
}
int gcd = a0>b0?b0:a0;
x = a/gcd;
y = b/gcd;
return;
}
int main()
{
int ans = 0;
int m = 20;
int n = 21;
for(int i = 0;i<m-1;++i)
{
for(int j = 0;j<n-1;++j)
{
for(int k = i+1;k<m;++k)
{
for(int p = j+1;p<n;++p)
{
int x = 0,y = 0;
dw(k-i,p-j,x,y);
if(zx[x][y][i][j] == 0){
zx[x][y][i][j] = 1;
++ans;
}
zx[x][y][k][p] = 1;
}
}
}
}
cout<<ans*2+m+n;
}