nyoj 管道問題 142 (數學計算幾何)

2021-07-06 07:47:41 字數 1560 閱讀 9158

時間限制:

3000 ms  |           記憶體限制:

1000 kb

難度:3

描述

有一寬度為1的折線管道,如圖所示,上面的各個定點為 (x0,y0),(x1,y1),(x2,y2) ……(xn,yn),下面各個定點為(x0,y0-1),(x1,y1-1),(x2,y2-1)……(xn,yn-1),假設管道都是不透明的,不反射的,光線從左邊入口的(x0,y0),(x0,y0-1)之間射入,向四面八方直線傳播,問光線最遠能射到**(x座標)或能穿透整個管道。

輸入

第一行有乙個整數2<=n<20(n為零結束),表示有n個管道,接下來的n行表示n個管道的上面座標(x0,y0),(x1,y1),(x2,y2)……(xn,yn)。測試資料組數大於0小於10000,所有座標的只不大於10000。

輸出如果光線不能穿過管道,輸出最遠的x座標,結果保留兩位小數。如果有光線可以透過管道,輸出「through all the pipe.」

樣例輸入

4

0 1

2 2

4 1

6 4

6

0 1

2 -0.6

5 -4.45

7 -5.57

12 -10.8

17 -16.550
樣例輸出

4.67

through all the pipe.

主要的思路就是窮舉所有的折點的組合,取任意兩個折點組成一條線,看看能不能跟所有的管道的上下折點構成的線段相交,如果所有都相交則說明光線能通過,否則求出所有光線中照的最遠的那個(窮舉的過程中設定乙個記錄變數) 這裡就需要計算兩個線段的交點(如果不能穿過管道,就要計算管道壁和光線的交點)。

#include#include#include#include#define e 1e-10

using namespace std;

struct zz

p[25][2];

double judge(zz a,zz b,zz c)//判斷左右方向

double check(zz a1,zz a2,zz b1,zz b2)//判斷是否相交

double zhexian(zz a,zz b,zz c)//計算三角形面積公式

double point(zz a1,zz a2,zz b1,zz b2)//計算交點座標

int main()

}if(j==n)

flag=true;}}

}}

} if(flag==true)

printf("through all the pipe.\n");

else

printf("%.2lf\n",mx);

} return 0;

}

nyoj 7 街區最短路徑問題 數學

找出橫縱座標的中位數,怎麼找 先對x排序找x的中位數x0,再對y排序找y的中位數y0 最後統計各點到中位數點 x0,y0 的總距離 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間...

nyoj 7 街區最短路徑問題 數學

找出橫縱座標的中位數,怎麼找 先對x排序找x的中位數x0,再對y排序找y的中位數y0 最後統計各點到中位數點 x0,y0 的總距離 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描寫敘述 乙個街區有非常多住戶,街區的街道僅僅能為東西 南北兩種方向。住戶僅僅能夠沿著街道行走。各個街...

NYOJ 7 街區最短路徑問題(數學問題)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使...