乳酪(不用回溯 剪枝 深搜dfs)

2021-10-06 03:39:04 字數 2985 閱讀 8420

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 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同...