計蒜客 UCF Local Programming Contest 2013(Practice)B題

  • 題目鏈接:https://nanti.jisuanke.com/t/43704
  • 題意:給定你一系列點,判斷能組成多少個三角形。
  • 分析:因爲一共也就100個點,所以直接暴力O(n3)即可。
    判斷三個點是否可以組成三角形:
    (1)斜率不存在,即三個點橫座標相等。
    (2)斜率存在,如果兩兩斜率相等,就無法組成三角形。
    這裏需要注意的是,如果用y1-y2/x1-x2這種方式計算斜率,最後判斷兩個斜率是否相等,是行不通的。因爲考慮到除法結果需要轉換到double,就有精度的問題,於是 y1-y2/x1-x2 = y2-y3/x2-x3 等價替換爲乘法,即 (y1-y2)(x2-x3) = (y2-y3)(x1-x2)。
  • 代碼
#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
typedef long long ll;
const int maxn = 1e2 + 5;
int n,t = 1,k;
typedef struct{
    double x;
    double y;
}Point;
vector<Point> vp;
bool ok(Point p1,Point p2, Point p3){
    bool check = true;
    double a1,a2;
    if (p1.x == p2.x && p2.x == p3.x) {
        check = false;
    }else{
        a1 = (p1.y-p2.y)*(p2.x-p3.x);
        a2 = (p2.y-p3.y)*(p1.x-p2.x);
        if (a1 == a2) {
            check = false;
        }
    }
    return check;
}
int main(){
    // freopen("1.txt","r",stdin);
    cin>>n;
    for (int kase = 0; kase < n; kase++) {
        vp.clear();
        cin>>k;
        double x,y;
        for (int i = 0; i < k; i++) {
            cin>>x>>y;
            vp.pb((Point){x,y});
        }
        int ans = 0;
        for (int i = 0; i < k; i++) {
            for (int j = i+1; j < k; j++) {
                for (int m = j+1; m < k; m++) {
                    if (ok(vp[i],vp[j],vp[m])) {
                        ans++;
                    }
                }
            }
        }
        printf("Test case #%d: %d triangle(s) can be formed.\n",t,ans);
        cout<<endl;
        t++;
    }
    return 0;
}

  • 遇到的問題
    問題就是判斷斜率相等了。double類型的值相等如果是除法,考慮到精度問題等,基本不可靠。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章