C语言输入一个整数n和n组坐标判断做多几个点在同一条直线上

题目描述

输入一个整数n和n组坐标,判断做多几个点在同一条直线上,要判断多少个点在同一条直线上,可以使用斜率的概念。如果两个点的斜率相等,则它们在同一条直线上。

源代码

#include <stdio.h>

int maxPointsOnLine(int** points, int pointsSize, int* pointsColSize) {
    if (pointsSize < 3) {
        return pointsSize;
    }
    
    int maxCount = 0;
    
    for (int i = 0; i < pointsSize; i++) {
        int duplicate = 1; // 重复点的数量
        int vertical = 0; // 垂直线上的点的数量
        int localMax = 0; // 在当前点为起点时的最大点数量
        
        for (int j = i + 1; j < pointsSize; j++) {
            // 计算两点的坐标差
            int x1 = points[i][0], y1 = points[i][1];
            int x2 = points[j][0], y2 = points[j][1];
            
            if (x1 == x2 && y1 == y2) {
                duplicate++;
            } else if (x1 == x2) {
                vertical++;
            } else {
                int count = 0;
                for (int k = 0; k < pointsSize; k++) {
                    int x = points[k][0], y = points[k][1];
                    if ((y - y1) * (x2 - x1) == (y2 - y1) * (x - x1)) {
                        count++;
                    }
                }
                if (count > localMax) {
                    localMax = count;
                }
            }
        }
        
        if (vertical + duplicate > localMax) {
            localMax = vertical + duplicate;
        }
        
        if (localMax > maxCount) {
            maxCount = localMax;
        }
    }
    
    return maxCount;
}

int main() {
    int n;
    printf("请输入点的数量n:");
    scanf("%d", &n);
    
    int** points = (int**)malloc(n * sizeof(int*));
    for (int i = 0; i < n; i++) {
        points[i] = (int*)malloc(2 * sizeof(int));
    }
    
    printf("请输入%d组坐标(x, y):\n", n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &points[i][0], &points[i][1]);
    }
    
    int result = maxPointsOnLine(points, n, NULL);
    printf("最多有%d个点在同一条直线上。\n", result);
    
    // 释放内存
    for (int i = 0; i < n; i++) {
        free(points[i]);
    }
    free(points);
    
    return 0;
}

以上代码中,我们首先定义了一个maxPointsOnLine函数来计算最多有多少个点在同一条直线上。该函数使用两层循环遍历所有可能的点对,并计算它们的斜率。同时,还记录了重复点和垂直线上的点的数量。

main函数中,我们首先读取输入的点的数量n,然后动态分配内存来存储n组坐标。接下来,使用循环读取每个点的坐标,并将它们传递给maxPointsOnLine函数进行计算。最后,输出结果并释放动态分配的内存。

请注意,以上代码仅为示例,没有对输入进行严格的错误处理。在实际应用中,你可能需要根据具体需求进行适当的输入验证和错误处理。

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享