51nod 1264 線段相交 (模板)

2021-07-06 06:37:40 字數 3097 閱讀 3073

演算法1:

[cpp]view plain

copy

///----------alg 1------------

struct

point  

;   

bool

between(

double

a, double

x0, 

double

x1)  

else

}  // 判斷兩條直線段是否有交點,有則計算交點的座標

// p1,p2是直線一的端點座標

// p3,p4是直線二的端點座標

bool

detectintersect(point p1, point p2, point p3, point p4)  

else

if( (fabs(p1.x-p2.x)<1e-6) ) 

//如果直線段p1p2垂直與y軸

else

}  else

}  else

if( (fabs(p3.x-p4.x)<1e-6) ) 

//如果直線段p3p4垂直與y軸

else

}  else

}  else

else

if(between(line_x,p1.x,p2.x)&&between(line_x,p3.x,p4.x))  

else

}  }  ///------------alg 1------------

演算法2:

[cpp]view plain

copy

///------------alg 2------------

//叉積

double

mult(point a, point b, point c)  

//aa, bb為一條線段兩端點 cc, dd為另一條線段的兩端點 相交返回true, 不相交返回false

bool

intersect(point aa, point bb, point cc, point dd)  

if( max(aa.y, bb.y)

if( max(cc.x, dd.x)

if( max(cc.y, dd.y)

if( mult(cc, bb, aa)*mult(bb, dd, aa)<0 )  

if( mult(aa, dd, cc)*mult(dd, bb, cc)<0 )  

return

true

;  }  

///------------alg 2------------

演算法3:

html

[c-sharp]view plain

copy

///------------alg 3------------

double

determinant(

double

v1, 

double

v2, 

double

v3, 

double

v4)  

// 行列式

bool

intersect3(point aa, point bb, point cc, point dd)  

double

namenda = determinant(cc.x-aa.x, cc.x-dd.x, cc.y-aa.y, cc.y-dd.y) / delta;  

if( namenda>1 || namenda<0 )  

double

miu = determinant(bb.x-aa.x, cc.x-aa.x, bb.y-aa.y, cc.y-aa.y) / delta;  

if( miu>1 || miu<0 )  

return

true

;  }  

///------------alg 3------------

main函式測試:

[cpp]view plain

copy

intmain()  

}  time_t

seconds2 = time (null);  

cout << "time used in alg 1:"

<< seconds2-seconds1 << 

" seconds."

<< endl;  

// alg 2

time_t

seconds3 = time (null);  

i=0;  

j=0;  

for( ; i!=20000; ++i )  

}  time_t

seconds4 = time (null);  

cout << "time used in alg 2:"

<< seconds4-seconds3 << 

" seconds."

<< endl;  

// alg 3

time_t

seconds5 = time (null);  

i=0;  

j=0;  

for( ; i!=20000; ++i )  

}  time_t

seconds6 = time (null);  

cout << "time used in alg 3:"

<< seconds6-seconds5 << 

" seconds."

<< endl;  

return

0;  

}     

vs2008編譯器環境下測試結果:

debug模式下: 

alg 1: 315 seconds;

alg 2: 832 seconds;

alg 3: 195 seconds;

release模式下: 

alg 1: 157 seconds;

alg 2: 169 seconds;

alg 3: 122 seconds;

51nod 1264 線段相交

題目 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no 這道題直接套白書裡面的模板就行 但是要注意的是因為白書給的那個模板不包含端點。所以我們這裡需要進行修改一下。包含了端點,所以自然點積就為0了。include incl...

51nod1264 線段相交

數學渣渣看了一下午各種找公式才明白 下面寫一下理解 判斷兩個線段相交與否。可以看成直線是否與線段相交 根據高數所學,向量的叉乘積,可以利用右手法則來判斷結果的方向。那麼如果兩種情況的方向乙個上,乙個下,那麼自然也就是不在直線的同側,那麼就滿足條件了。是有需要注意x,y用double型別,否則乘法會有...

51Nod 1264 線段相交

1264 線段相交 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t...