
//
求解方法:
构造所有直线 用 map 去重
难点在于 怎么确定直线唯一表示形式
01 两点式 2 点确定 1 条直线 但存在 4 个坐标值 注意到 不同的两点 可能确定同 1 条直线
02 点斜式 1 个斜率 2 个坐标值 直线经过很多点 哪个点具有代表性 ?
03 斜距式 1 个斜率 1 个截距 注意考虑到 斜率不存在的情况 —— ok
pair_
// set
#include<bits/stdc++.h>
using namespace std;
vector< pair<double,double> > v;
set< pair<double,double> > st;
set< pair<double,double> >::iterator it;
int main()
{
int cnt=0,ans=20+21,i,j;
double k,b;
v.clear();
for( i=0;i<20;i++ ) // 构造点
for( j=0;j<21;j++ )
{ v.push_back( make_pair( i,j ) ); cnt++; }
st.clear();
// 遍历两点
for( i=0;i<cnt;i++ )
for( j=0;j<cnt;j++ )
{
// 特殊处理
if( v[i].first==v[j].first || v[i].second==v[j].second ) continue;
k=( v[i].second-v[j].second )/( v[i].first-v[j].first );
b=( v[i].first*v[j].second - v[j].first*v[i].second )/( v[i].first-v[j].first );
// b=v[i].second-k*v[i].first; (x) 涉及精度问题
it=st.find( make_pair( k,b ) );
if( it==st.end() ) { st.insert( make_pair( k,b ) ); ans++; }
}
cout<<ans<<endl;
return 0;
}
// map
#include<bits/stdc++.h>
using namespace std;
struct point { double x,y; }p[25*25];
map< pair<double,double>,int >maps;
int main()
{
int cnt=0,ans=20+21,i,j;
double k,b; // double 类型
// 构造点
for( i=0;i<20;i++ )
{
for( j=0;j<21;j++ )
{
p[cnt].x=i; p[cnt].y=j; cnt++;
}
}
// 遍历两点
for( i=0;i<cnt;i++ )
{
for( j=0;j<cnt;j++ )
{
// 特殊处理 横线和竖线
if( p[i].x==p[j].x || p[i].y==p[j].y ) continue;
k=( p[i].y-p[j].y )/( p[i].x-p[j].x );
b=( p[i].x*p[j].y-p[j].x*p[i].y )/( p[i].x-p[j].x );
// b=p[i].y-k*p[i].x; (x) 精度问题
if( maps[ { k,b } ]==0 ) { maps[ { k,b } ]=1; ans++; }
}
}
printf("%d\n",ans);
return 0;
}
//
b=y-kx;
=y1-(y1-y2)/(x1-x2)*x1;
=( y1*x1-y1*x2 -y1*x1+y2*x1 )/( x1-x2 );
=( x1*y2-x2*y1 )/( x1-x2 );