計蒜客 2019 藍橋杯省賽 A 組模擬賽(一)F 掎角之勢

  • 題目鏈接 :https://nanti.jisuanke.com/t/A2226
  • 題意:給定三個點,求三角形的內切圓和外接圓的面積(需要先判斷是否能構成三角形)
  • 思路:
    1)判斷三角形 :不要用a+b>c的方法了!既然上了大學就用叉乘,判斷向量叉乘是否 = 0,如果是0就無法構成三角形。
    2)求三角形面積:不要用海倫公式了!既然上了大學就用叉乘,向量a向量b = ab*sinα = 1/2 S
  • 代碼:
#include "bits/stdc++.h"
#define fori(i,l,u) for(int i = l;i < u;i++)
#define forj(j,l,u) for(int j = l;j < u;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn = 1e5;
int T;
double a1,b1,a2,b2,a3,b3;
double A,B,C;
double s = 0;
double S1,S2,r1,r2;
double length(double a1,double b1,double a2,double b2){
    return sqrt(pow(a1-a2,2)+pow(b1-b2,2));
}
int main(){
    freopen("1.txt","r",stdin);
    cin>>T;
    while (T--) {
        cin>>a1>>b1>>a2>>b2>>a3>>b3;
        A = length(a1,b1,a2,b2);
        B = length(a1,b1,a3,b3);
        C = length(a2,b2,a3,b3);
        s = fabs((a1-a2)*(b3-b2) - (b1-b2)*(a3-a2));
        if (s == 0) {
            cout<<"NO SOLUTION"<<endl;
        }else{
            r1 = s/(A+B+C);
            r2 = (A*B*C)/(2*s);
            S1 = M_PI*r1*r1;
            S2 = M_PI*r2*r2;
            printf("%.10lf %.10lf\n",S1,S2);
        }
    }
    return 0;
}

  • 遇到的問題:
    1)好久不寫題忘了叉乘怎麼求了。。。
    2)剛開始想用叉乘判斷是否構成三角形時需不需要三個向量兩兩相乘,但是只要是倆向量叉乘 = 0就三點一線,構不成,否則肯定≠0.
    3)都用double。並且最後輸出的時候用printf能精確小數點的位數。
    4)π在c/cpp裏是M_PI 表示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章