【問題G19】運河。 [回前頁]
有兩個城市想要挖一條運河來運輸產品。兩市的市長邀請著名水利工程師痞子蔡來負責這項工作。由於痞子蔡最近沒有工作,所以馬上就答應了。答應後才發現有很多限制:
這兩市各設有一些集散地(市集),許多產品如蔗糖、稻米等,都會先送到此再作處理;這些集散地已經歷史悠久,地點已經為大家所熟知且不會再更改。這兩市就是希望藉由運河來把產品往外送,但他們對要挖的運河作了一些限制:
(1)這運河的兩邊必須平行,而且是直線。
(2)集散地當然不能在運河內部,不過集散地可以剛好在河岸上;而且同一市的集散地要在河的同一邊,也就是在河的同一側不能同時有兩市的集散地
(3)運河當然越寬越好
為了簡化題目,我們將各集散地視為一個點,也就是沒有面積。其次,我們可以將運河的兩岸視作兩條無限延伸的平行直線。所以現在痞子蔡的任務就是要想辦法,用兩條平行直線將平面上的兩堆點分開。可以參考下面兩個圖:
從上面可以很明顯的看出,雖然兩圖都符合(1)跟(2)的限制,但左圖的寬度明顯比右圖還要來得窄,所以我們希望運河長得能像右圖這樣。
現在痞子蔡遇到了麻煩,因為他不知道要如何定出運河的河岸,所以希望你能夠助他一臂之力。
輸入檔說明
輸入檔包含了多筆的測試資料。每筆測試資料的第一行為兩個正整數m n (1 £ m,n £ 50),以一個以上的空白隔開,各代表兩市集散地的個數。接下來會有m+n行代表集散地的位置,前m行(第2 ~ m+1行)代表第一個城市的m個集散地;後n行(第m+2 ~ m+n-1行)代表第二個城市的n個集散地。這m+n行中,每一行都含有兩個浮點數x y,代表此集散地在平面上的坐標(x,y) (-1000 £ x,y £ 1000)。這m+n+1行就代表著一筆測試資料。
輸入檔以m=n=0作為結束。你的程式不需要對這行輸入作處理。
輸出檔說明
對於每一筆測試資料,依序輸出 (i) 一個浮點數(精確至小數點下第三位),代表運河最大的可能寬度;或是 (ii) 輸出字串 IMPOSSIBLE,如果無法找到符合規則的運河,或是運河最大的寬度為0。
每一行恰好輸出一筆測試資料的答案。
範例輸入
5 4
-3 2
-3.5 0
-3 –2.5
-1 1
-1 –1
1 1
1 –1
3 1
3 –2
3 3
0 0
-1 0
0 -1
1 1
1 0
0 1
4 1
1 1
1 –1
-1 1
-1 –1
0 0
2 2
1 100
1 –100
1 1
1 –1
2 2
1 100
1 1
1 –1
1 -100
0 0
範例輸出
2
0.707
IMPOSSIBLE
IMPOSSIBLE
2