描述:
-
给定平面上的n个点,任意做一条直线,求至多能有几个点恰好落在直线上。
- 输入:
-
包含多组测试数据,每组测试数据由一个整数n(0<=n<=100)开始,代表平面上点的个数。
接下去n行每行给出一个点的坐标(x,y),x、y的绝对值均小于等于100。
- 输出:
-
对于每组测试数据,输出一个整数,表示至多能有几个点恰好落在直线上。
- 样例输入:
-
2 0 0 1 1 4 0 0 1 1 2 2 3 6
- 样例输出:
-
2 3
//分数 struct Node{ double zi ; double mu ; Node(){} ; Node(double z , double m):zi(z),mu(m){} ; friend bool operator < (const Node A , const Node B){ return A.zi * B.mu < A.mu * B.zi ; } friend bool operator == (const Node A , const Node B){ return A.zi * B.mu == A.mu * B.zi ; } }; struct Point { double x ; double y ; }p[108]; int n ; //固定一个点i必须出现,那么斜率相同的点就在一条直线上了,统计最大值 。 int get_max(int id){ int i ; double x = p[id].x ; double y = p[id].y ; int ans = 0 ; map<Node , int> mp ; //Node 为分数。 做分数->int的映射。 map<Node , int> ::iterator it ; mp.clear() ; for(i = 1 ; i <= n ; i++){ if(i == id) continue ; if(p[i].x == x) ans++ ; else mp[Node(p[i].y - y , p[i].x - x)]++ ; } for(it = mp.begin() ; it != mp.end() ; it++) ans = max(ans , it->second) ; return ans + 1 ; } int main(){ int i , ans ; while(cin>>n){ for(i = 1 ; i <= n ; i++) cin>>p[i].x>>p[i].y ; ans = 0 ; for(i = 1 ; i <= n ; i++) ans = max(ans , get_max(i)) ; cout<<ans<<endl ; } return 0 ; }