NOYJ83 迷宮尋寶(二) 計算幾何

2021-07-31 23:58:15 字數 1956 閱讀 2024

時間限制:

1000 ms  |  記憶體限制:

10000 kb

難度:5

描述

乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮是一100*100的個正方形區域,裡面有很多牆,這些牆都是由一些直線構成的,如下圖。

牆把迷宮分隔成很多藏寶室,任何兩個藏寶室之間都沒有門。

acm現在準備用開鑿裝置在相鄰兩個藏寶室的牆中間鑿開乙個門,最終取出迷宮中的寶物。

但是,開鑿門是一件很費力費時的工作,acm想開鑿盡量少的門取出寶物,現在請你寫乙個程式來幫助它判斷一下最少需要開幾個門吧。

輸入

第一行輸入乙個正數n(n<10)表示測試資料組數

每組測試資料的第一行是乙個整數n(0<=n<=30),代表了牆的個數,隨後的n行裡每行有四個整數x1,x2,y1,y2,這四個數分別是代表乙個牆的兩個端點的座標。外圍的正方形四個頂點固定在(0,0)(0,100)(100,0)(100,100)這四堵個牆不在上面的n個數里。注意,不能在兩個線的交點處開鑿門。

資料保證任意兩個中間牆的交點不在四周的牆上。

輸完所有的牆後,輸入兩個數,x,y(可能不是整數),表示寶藏的座標。

輸出輸出最少需要開鑿的門的個數

樣例輸入

1

7 20 0 37 100

40 0 76 100

85 0 0 75

100 90 0 90

0 71 100 61

0 14 100 38

100 47 47 100

54.5 55.4

樣例輸出

2
**

east central north america 1999 改編

上傳者

張云聰思路:

讀完題目以後應該知道這道題是就是求線段相交問題。我用的方法是連線邊界所有點與所給的財寶位置連線成線段,與所給出牆一一判斷是否相交。不用擔心題目說的不能再交點處鑿牆,這點不用擔心,因為我們想象的的理想狀態直線線段,到時候只要稍微繞一點就過來。聯絡實際。

判斷是否相交用叉乘判斷(相關判斷方法見

#include #include #include typedef struct node

pos;

typedef struct segment

segment;

segment wall[50];

double det(pos a, pos b, pos c)//ac×ab

int cross(pos a, pos b, pos c, pos d)

else }

int main()

scanf("%lf%lf", &cp.x, &cp.y);

tw.ep = cp;

min = 0xfffffff;//16進製為最大的整數

for(i = 0; i <= 100; i++)

}if(cnt < min)

tp.x = i;

tp.y = 100;//上邊界

tw.sp = tp;

cnt = 0;

for(j = 0; j < n; j++)

}if(cnt < min)

tp.x = 0;

tp.y = i;//左邊界

tw.sp = tp;

cnt = 0;

for(j = 0; j < n; j++)

}if(cnt < min)

tp.x = 100;

tp.y = i;//右邊界

tw.sp = tp;

cnt = 0;

for(j = 0; j < n; j++)

}if(cnt < min)

}printf("%d\n", min+1);

} return 0;

}

迷宮尋寶(二)

時間限制 1000 ms 記憶體限制 10000 kb 難度 5 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮是一100 100的個正方形區域,裡面有很多牆,這些牆都是由一些直線構成的,如下圖。牆把迷宮分隔成很多藏寶室,任何兩個藏寶室之間都沒有門...

Q 迷宮尋寶

洪尼瑪今天準備去尋寶,在乙個n n n行,n列 的迷宮中,存在著乙個入口 一些牆壁以及乙個寶藏。由於迷宮是四連通的,即在迷宮中的乙個位置,只能走到與它直接相鄰的其他四個位置 上 下 左 右 現洪尼瑪在迷宮的入口處,問他最少需要走幾步才能拿到寶藏?若永遠無法拿到寶藏,則輸出 1。input 多組測試資...

迷宮尋寶 一

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到開啟這個門所...