1. 程式人生 > >51 Nod 1265 四點共面

51 Nod 1265 四點共面

tps ostream 根據 nco int pla namespace 如何 提取

題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#problemId=1265&noticeId=352691

題意:判斷四點共面

題解:假設有a,b,c,d四個點,如果ab,ac,ad三個向量線性相關,那麽三個向量共面(充要條件)。

如何判斷三個向量是否線性相關,以三個向量元素列一個3x3的行列式,如果求得的值為0,說明線性相關。

證明:如果ab,ac,ad線性相關,那麽ab=k1*ac+k2*ad,根據行列式的性質:如果兩行(列)成比例,那麽行列式的值為0。

(這個可以先把系數提取出來,然後就有兩行(列)相同,行列式的值為0)

 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct point{
 5     int x,y,z;
 6 };
 7 
 8 int is_coplanar(point a,point b,point c,point d){
 9     point ab,ac,ad;
10     ab.x=a.x-b.x,ab.y=a.y-b.y,ab.z=a.z-b.z;
11     ac.x=a.x-c.x,ac.y=a.y-c.y,ac.z=a.z-c.z;
12     ad.x=a.x-d.x,ad.y=a.y-d.y,ad.z=a.z-d.z;
13 int tmp=ab.x*ac.y*ad.z+ab.y*ac.z*ad.x+ac.x*ad.y*ab.z; 14 tmp-=ab.z*ac.y*ad.x+ab.x*ac.z*ad.y+ab.y*ac.x*ad.z; 15 return tmp; 16 } 17 18 int main(){ 19 int t; 20 cin>>t; 21 while(t--){ 22 point a,b,c,d; 23 cin>>a.x>>a.y>>a.z>>b.x>>b.y>>b.z>>c.x>>c.y>>c.z>>d.x>>d.y>>d.z;
24 if(!is_coplanar(a,b,c,d)) cout<<"Yes"<<endl; 25 else cout<<"No"<<endl; 26 } 27 28 return 0; 29 }

51 Nod 1265 四點共面