uva 270 Lining Up

继续复习

暴力

给出n个点的坐标,选出最多的点,在一条直线上

直接暴力,不过时间比较糟糕。一个二重循环,枚举i,j两个点,这两点确定一条直线,然后枚举剩下的点看是否在这条直线上,所以一个三重循环,时间复杂度O(n^3)

注意枚举不要做重复的工作,否则会超时

另外这题是有O(n^2logn)的算法的

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 710
#define LEN 110

int n;
struct point
{
   int x,y;
}p[N];
typedef struct point point;

int line(int i ,int j ,int k)
{
   return (p[j].y-p[i].y)*(p[k].x-p[i].x) - (p[j].x-p[i].x)*(p[k].y-p[i].y);
}

void solve()
{
   int max = 2;
   for(int i=0; i<n; i++)
      for(int j=i+1; j<n; j++) //枚举两点
      {
         int res = 2;
         for(int k=j+1; k<n; k++)
            if(k!=i && k!=j)
            {
               if(!line(i,j,k))
                  res++;
            }
         if(res > max) max = res;
      }
   printf("%d\n",max);
}

int main()
{
   int T;
   scanf("%d",&T);
   getchar(); getchar();
   while(T--)
   {
      char str[LEN];
      n = 0;
      while(1)
      {
         if(!gets(str))      break;
         if(!strcmp(str,"")) break;
         sscanf(str,"%d%d",&p[n].x , &p[n].y);
         n++;
      }
      solve();
      if(T) printf("\n");
   }
   return 0;
}
原文地址:https://www.cnblogs.com/scau20110726/p/3043267.html