51 Nod 1265 四點共面
阿新 • • 發佈:2017-10-14
tps ostream 根據 nco int pla namespace 如何 提取
題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#problemId=1265¬iceId=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 四點共面