(斜率,点和线段)zzuli1196数星星(二)
題目描述
一天,小明坐在院子里數星星,Gardon就出了個難題給他,讓他數數天上的星星最多有多少個是在同一條直線上的。天上的星星太多了,小明馬上就看花了眼,你能寫個程序來幫他計算么?
輸入
首先輸入一個整數N(N<=300),接下來的N對數每對表示一個星星的位置(星星的坐標在-10000到10000之間,精確到小數點后1位)。沒有兩個星星會在同一個位置。
輸出
一個整數,表示一條直線上最多星星的數目。
樣例輸入
5
0 0
1 0
1 1
0 1
0.5 0.5
樣例輸出
3
分析與解
我以維特根斯坦的論述方式來分析:
對于斜率,點,以及線段來說:
1.兩點確定一條直線,直線具有斜率
2.斜率可以取0到無窮
3.斜率為無窮時說明直線與y軸平行或重合
4.斜率為無窮時說明斜率公式中分母為零
5.斜率為無窮時,其值具有相對性:2?00?0和?1?00?0\frac{2-0}{0-0}和\frac{-1-0}{0-0}0?02?0?和0?0?1?0?
一個是正無窮,一個是負無窮,但是其都是在一條直線上的(y軸)。
6.共線問題建立在三個點的基礎之上
7.我們不能通過一般的斜率公式是否相等來斷定三個點是否共線
8.可以通過乘式判斷3點共線
(y3?y1)(x2?x1)?(y2?y1)(x3?x1)=0(y3?y1)(x2?x1)?(y2?y1)(x3?x1)=0(y3?y1)(x2?x1)?(y2?y1)(x3?x1)=0
9.n個點,每一個點都能和剩下n-1個點組成線段
10.當每個點都不共線時,n個點組成的不同直線的個數最多
11.A點和B點組成線段也意味著B點和A點組成線段
12.n個點組成最多不同直線個數為n?(n?1)2\frac {n*(n-1)}{2}2n?(n?1)?
解題思路:
1.確定兩個點,找第三個點,看看他們是否共線,如果共線,當前標記數組加一。
2.兩個確定點要取到所有不重復情況。
3.兩個點,那么一定共線,所以我們只需要找有多少其余的點在那條線上。然后再加上2就是所有在這條線上的點。
代碼
#include<iostream> #include<algorithm> using namespace std; struct star{double x;double y; }; int main(){int n;star s[333];cin>>n;for(int i=0;i<n;++i){cin>>s[i].x>>s[i].y;}int m=0;int b[100860];for(int i=0;i<n;++i){for(int j=i+1;j<n;++j){for(int k=j+1;k<n;++k){if((s[k].y-s[i].y)*(s[k].x-s[j].x)-(s[k].y-s[j].y)*(s[k].x-s[i].x)==0){b[m]+=1;}}m++;}}sort(b,b+m);if(n==1) cout<<1;else if(n<=0) cout<<0;else cout<<b[m-1]+2; }總結
以上是生活随笔為你收集整理的(斜率,点和线段)zzuli1196数星星(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python基本对象类型
- 下一篇: js语句连接mysql数据库_js中re