description
現有一塊**酪,它的高度為 h,它的長度和寬度我們可以認為是無限大的,乳酪 中間有許多 半徑相同 的球形空洞。我們可以在這塊乳酪中建立空間座標系,在座標系中, 乳酪的下表面為z=0,乳酪的上表面為z=h。
現在,乳酪的下表面有乙隻小老鼠 jerry,它知道乳酪中所有空洞的球心所在的坐 標。如果兩個空洞相切或是相交,則 jerry 可以從其中乙個空洞跑到另乙個空洞,特別 地,如果乙個空洞與下表面相切或是相交,jerry 則可以從乳酪下表面跑進空洞;如果 乙個空洞與上表面相切或是相交,jerry 則可以從空洞跑到乳酪上表面。
位於乳酪下表面的 jerry 想知道,在 不破壞乳酪 的情況下,能否利用已有的空洞跑 到乳酪的上表面去?
空間內兩點p1(x1,y1,z1)、p2(x2,y2,z2)的距離公式如下:
每個輸入包含多組資料。
的第一行,包含乙個正整數 t,代表該輸入檔案中所含的資料組數。
接下來是 t 組資料,每組資料的格式如下: 第一行包含三個正整數 n,h 和 r,兩個數之間以乙個空格分開,分別代表乳酪中空 洞的數量,乳酪的高度和空洞的半徑。
接下來的 n 行,每行包含三個整數 x,y,z,兩個數之間以乙個空格分開,表示空 洞球心座標為(x,y,z)。
output
t 行,分別對應 t 組資料的答案,如果在第 i 組資料中,jerry 能從下 表面跑到上表面,則輸出yes,如果不能,則輸出no(均不包含引號)。
第乙個空洞在(0,0,0)與下表面相切
第二個空洞在(0,0,4)與上表面相切 兩個空洞在(0,0,2)相切
輸出 yes
第二組資料,由乳酪的剖面圖可見:
兩個空洞既不相交也不相切
輸出 no
第三組資料,由乳酪的剖面圖可見:
兩個空洞相交 且與上下表面相切或相交
輸出 yes
資料範圍:
對於20%的資料,n=1 , 1≤h , r≤10,000,座標的絕對值不超過10,000。
對於40%的資料,1≤n≤8 , 1≤h , r≤10,000,座標的絕對值不超過10,000。
對於80%的資料, 1≤n≤1,000 , 1≤h , r≤10,000,座標的絕對值不超過10,000。
對於100%的資料,1≤n≤1,000 , 1≤h , r≤1,000,000,000,座標的絕對值不超過1,000,000,000。
time limit
1000ms
memory limit
256mb
分析:此題是路徑存在性問題,所以用深搜。
此題的狀態空間為老鼠在哪個洞裡,進一步即老鼠所在球洞的中心座標。
在這道題裡,和排列組合類問題不同的是:老鼠走到已經走過的洞是沒有意義的,那樣相當於又回到「起點」,類似於將進度條往回拖,這個洞的路況和之前第一次列舉到這個洞的時候一樣,接下來走的路徑也會和第一次列舉到這個洞之後走的路徑一樣,所以這題可以通過排除已經走過的洞來剪枝,即這題只用標記,不用回溯。
為了**簡潔性,可以使深搜函式的返回值為bool型,這樣只要找到一條通路,就會連鎖反應,一路return true,直到退出所有深搜函式的呼叫。
此題包含多組資料,每計算一組資料之前都要做好初始化工作。另外,由資料範圍,最好開long long int。
最後,本題中計算兩球洞中心之間距離時沒必要開平方,因為這樣會丟失精度,也會增加計算複雜度,計算出兩球洞中心之間距離的平方後,直接和球洞直徑的平方相比較即可。
#include
#include
struct point//球洞中心座標
data[
1000];
//題目球洞資料
int t,n;
//資料組數、每組球洞數
long
long
int h,r,r_judge;
//乳酪高度、球洞半徑、球洞直徑的平方
bool vis[
1000
],flag;
//標記走過的洞、找到通路標誌
bool
judge
(int m,
int i)
//判斷兩個洞是否相通
bool
dfs(
int m)
//鑽到球洞m裡
for(
int i=
0;i//所有的洞都走完了,迴圈自然結束,說明此路不通
return
false;}
intmain()
flag=
false
;//初始化
memset
(vis,0,
sizeof
(vis));
//初始化
for(
int i=
0;i}if
(flag)
printf
("yes\n");
else
printf
("no\n");
--t;
}return0;
}
hdu1010(深搜 剪枝 回溯)
這個題目我做的時候不是超時就是錯誤,自己是新手也一直不知道再怎麼剪下去 就參考了網上一大牛blog 如下 include include include hdu1010 深搜優化剪枝 int m,n,t char map 8 8 int d 4 2 int ex,ey,sx,sy,ok void d...
數獨 深搜 剪枝 遞迴 回溯
數獨是乙個我們都非常熟悉的經典遊戲,運用計算機我們可以很快地解開數獨難題,現在有一些簡單的數獨題目,請編寫乙個程式求解。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的。輸出描述 輸出九行,每行九個空格隔開的數字,為解出的答案。思路 深搜 剪枝 遞迴 回溯凡是類似於迷宮的尋找路...
n皇后問題 深搜回溯dfs
問題介紹 n皇后問題是乙個以西洋棋為背景的問題 如何能夠在n n的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。eg 在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同...