算法提高 12-1三角形
时间限制:1.0s 内存限制:256.0MB
问题描述
为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。
样例输出
与上面的样例输入对应的输出。
例:
例:
数据规模和约定
输入数据中每一个数的范围。
例:doule型表示数据。
例:doule型表示数据。
问题不难,感觉有点麻烦。
另外如何用克拉默法则解二元一次方程。
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <queue> #include <cstring> #include <algorithm> #include <cstdlib> #define for(i,x,n) for(int i=x;i<n;i++) #define ll long long int #define INF 0x3f3f3f3f #define MOD 1000000007 #define MAX_N 50005 using namespace std; struct triangle{double x,y;}; triangle a,b,c; double perimeter(triangle a,triangle b,triangle c){ double d1=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); double d2=sqrt(pow(b.x-c.x,2)+pow(b.y-c.y,2)); double d3=sqrt(pow(a.x-c.x,2)+pow(a.y-c.y,2)); return d1+d2+d3; } double area(triangle a,triangle b,triangle c){ double d1=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)); double d2=sqrt(pow(b.x-c.x,2)+pow(b.y-c.y,2)); double d3=sqrt(pow(a.x-c.x,2)+pow(a.y-c.y,2)); double p=(d1+d2+d3)/2; double area=sqrt(p*(p-d1)*(p-d2)*(p-d3)); return area; } triangle external(triangle aa,triangle bb,triangle cc){ double a=2*(aa.x-bb.x); double b=2*(aa.y-bb.y); double z=aa.x*aa.x-bb.x*bb.x+aa.y*aa.y-bb.y*bb.y; double a1=2*(cc.x-bb.x); double b1=2*(cc.y-bb.y); double z1=cc.x*cc.x-bb.x*bb.x+cc.y*cc.y-bb.y*bb.y; triangle ex; //ex.y=(z-z1*a/a1)/(b-a*b1/a1); //ex.x=(z-b*ex.y)/a; ex.x=((z*b1)-(z1*b))/((a*b1)-(a1*b)); ex.y=((a*z1)-(a1*z))/((a*b1)-(a1*b)); return ex; } triangle gravityOfCenter(triangle a,triangle b,triangle c){ triangle gra; gra.x=(a.x+b.x+c.x)/3; gra.y=(a.y+b.y+c.y)/3; return gra; } int main() { //freopen("data.txt", "r", stdin); //freopen("data.out", "w", stdout); scanf("%lf %lf",&a.x,&a.y); scanf("%lf %lf",&b.x,&b.y); scanf("%lf %lf",&c.x,&c.y); printf("%.2lf ",perimeter(a,b,c)); printf("%.2lf ",area(a,b,c)); printf("%.2lf %.2lf ",external(a,b,c).x,external(a,b,c).y); printf("%.2lf %.2lf ",gravityOfCenter(a,b,c).x,gravityOfCenter(a,b,c).y); //fclose(stdin); //fclose(stdout); return 0; }