class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param points int整型vector<vector<>> 
     * @return int整型
     */
    int maxPoints(vector<vector<int> >& points) {
        // write code here
        
        // double为斜率,后面存储坐标点
        map<double,set<pair<double,double>>> m_1;
        // 处理共竖线和共横线的情况;
        map<string,set<pair<double,double>>> m_2;
        
        // 第i个点
        for(int i=0; i<points.size(); ++i)
        {
            double x_1 = (double)points[i][0];
            double y_1 = (double)points[i][1];
            // i之后的点
            for(int j=i+1; j<points.size(); ++j)
            {
                double x_2 = (double)points[j][0];
                double y_2 = (double)points[j][1];

                // 两点之间的坐标距
                double x_len = x_2-x_1;
                double y_len = y_2-y_1;

                // 共竖线
                if(x_len==0)
                {
                    m_2["sameX"].emplace(make_pair(x_1,y_1));
                    m_2["sameX"].emplace(make_pair(x_2,y_2));
                }
                // 共横线
                else if(y_len==0)
                {
                    m_2["sameY"].emplace(make_pair(x_1,y_1));
                    m_2["sameY"].emplace(make_pair(x_2,y_2));
                }
                // 其它斜率
                else
                {
                    m_1[y_len/x_len].emplace(make_pair(x_1,y_1));
                    m_1[y_len/x_len].emplace(make_pair(x_2,y_2));
                }
            }
        }

        int ans = 0;

        for(auto it=m_1.begin(); it!=m_1.end(); ++it)
            ans = max(ans,(int)(it->second).size());

        ans = max(ans,(int)m_2["sameX"].size());
        ans = max(ans,(int)m_2["sameY"].size());

        return ans;
    }
};