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;

}

 

你可能感兴趣的:(ini)