三道题用的一个代码,,,水过了。
题意都是:给出平面若干个点的坐标,求共线的点的最多的点的数目。即在同一条直线的上的最多的点数目。
解题思路是:求出两两坐标的两点间的斜率,然后一次比较斜率,相同的则共线,求出最大的共线数,输出即可。
(或者可以用三个点共线的做,其实质依然是靠斜率来判断是否共线)。
代码如下(两点斜率):
/***** 简单ACM水题 ********/ /******** written by C_SuooL_Hu ************/ ////////////////直线与点/////////////// ////////////////POJ_1118_2606_2780/////////////// /****************************************************************************/ /* 题目大意:给出平面上若干点,求属于同一条的直线的最多点数。 思路:分别求出其中一点与其它点的直线的斜率,进行排序,如果斜率相同则同一条直线。 */ /****************************************************************************/ #include <iostream> #include <cstdio> #include <memory.h> using namespace std; const double INF=210000000; struct point { int x,y; }; int cmp(const void *a ,const void *b) { if( *(double*)a> *(double *)b) return 1; else return -1; } point p[1010]; double k[1010]; int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int N, i, j, l, counter, ans; while(cin >> N && N) { for(i=0;i<N;i++) cin >> p[i].x >> p[i].y ; ans = 0; for(i=0;i<N-1;i++) { for(j=i+1,l=0;j<N;j++,l++) { if(p[i].x==p[j].x) k[l]=INF; else k[l]=double(p[i].y-p[j].y)/(p[i].x-p[j].x); } qsort(k,l,sizeof(k[0]),cmp); for(j=0;j<l;j++) { counter=1; while(j+1<l && k[j]==k[j+1]) { j++; counter++; } if(counter>ans) ans=counter; } } printf("%d\n",ans+1); } return 0 ; }
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn=202; struct point { int x; int y; } pnt[maxn]; int main() { //freopen("in.txt","r",stdin); int n, max, cnt, i, j, k; while(cin >> n) { memset(pnt,0,sizeof(pnt)); for(i=0;i<n;i++) { cin >> pnt[i].x >> pnt[i].y; } max=0; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { cnt=0; for(k=j+1;k<n;k++) { if(k==i || k==j)continue; int left=(pnt[i].x-pnt[k].x)*(pnt[j].y-pnt[k].y); int right=(pnt[j].x-pnt[k].x)*(pnt[i].y-pnt[k].y); if(left==right)cnt++; } if(cnt>max)max=cnt; } } cout << max+2 << endl; } return 0; }
【未完待续】.......