時間限制:
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必須開啟門,但是,開門之前必須在迷宮裡找到開啟這個門所...