POJ 1118 Lining Up(我的水题之路——斜率最多)

这道题看上去感觉像是几何题,题中给了最多700个点,让你求出这700个点中最多有多少个共线。

由于数据量比较少就选择用暴力过,

对于每一个点,对于其他所有点进行求斜率,将所有的斜率存在一个数组中,之后对这个数组进行排序,排序之后,对于相邻的两个斜率进行比较,如果两个斜率相同,就让共点数+1.求出共点数的最大值。

注意两点:

1、该题的共点数最小为2,因为至少有两个点共线,这一点让我WA了很久!T_T

2、如果,两个点的横坐标相同,则其斜率为无穷大,就定义为一个比较大的常数32767

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int aid[1000][2];
float xielv[1000];

int main(void){
    int i, j, k;
    int max, tmp;
    int n;

    while (scanf("%d", &n), n != 0){
        memset(aid, 0, sizeof(aid));
        for (i = 0; i < n; i++){
            scanf("%d%d", &aid[i][0], &aid[i][1]);
        }
        max = 2;
        for (i = 0; i < n - 1; i++){
            for (j = i + 1, k = 0; j < n; j++){
                if (aid[j][0] == aid[i][0]){
                    xielv[k++] = 32767;
                }
                else{
                    xielv[k++] = (float)(aid[j][1] - aid[i][1]) / (float)(aid[j][0] - aid[i][0]);
                }
            }
            sort(xielv, xielv + k);
            for (j = 1, tmp = 2; j <= k; j++){
                if (xielv[j] == xielv[j - 1]){
                    tmp ++;
                    if (tmp > max){
                        max = tmp;
                    }
                }
                else{
                    tmp = 2;
                }
            }
        }
        printf("%d\n", max);
    }
    return 0;
}

你可能感兴趣的:(UP,float)