深度優先搜尋(DFS)之拯救007

2021-10-04 04:49:34 字數 1765 閱讀 5046

看了浙大的資料結構課程,在講到圖的相關演算法時,有提到這道題,於是參考了別人的c++**,自己編寫了乙個c語言版本的。**還有很多值得完善的地方,如果有發現錯誤,歡迎指正,謝謝~

先附上原文的鏈結

(dfs) 拯救007 (25 分)

在老電影「007之生死關頭」(live and let die)中有乙個情節,007被毒販抓到乙個鱷魚池中心的小島上,他用了一種極為大膽的方法逃脫 —— 直接踩著池子裡一系列鱷魚的大腦袋跳上岸去!(據說當年替身演員被最後一條鱷魚咬住了腳,幸好穿的是特別加厚的靴子才逃過一劫。)

設鱷魚池是長寬為100公尺的方形,中心座標為 (0, 0),且東北角座標為 (50, 50)。池心島是以 (0, 0) 為圓心、直徑15公尺的圓。給定池中分布的鱷魚的座標、以及007一次能跳躍的最大距離,你需要告訴他是否有可能逃出生天。

首先第一行給出兩個正整數:鱷魚數量 n(≤100)和007一次能跳躍的最大距離 d。隨後 n 行,每行給出一條鱷魚的 (x,y) 座標。注意:不會有兩條鱷魚待在同乙個點上。

如果007有可能逃脫,就在一行中輸出"yes",否則輸出"no"。

14

2025-15

-25288

492915-

35-25

2827-29

-8-28

-20-35

-25-20

-1329-

3015-35

4012

12

yes
#include

#include

#include

#include

int mark[

100]

;//用於記錄各結點(鱷魚)是否跳到過,預設沒有被跳到過,為 0

int n;

//用於記錄結點(鱷魚)的總數

int jumpsize;

//用於記錄每次可以跳出的距離

double r =

7.5;

//用於儲存中心小島的半徑

int set;

//用於標記最終的結果(看到最後就知道有什麼用了)

struct node

;//用於判斷node1和node2能不能互相跳過去

bool canjump

(struct node* node1,

struct node* node2)

return false;

}//用於判斷從當前結點能否直接跳上岸

bool rightnode

(struct node* node)

return false;

}//演算法核心,深度優先搜尋,判斷從當前的第x個結點起跳,最終能否跳上岸

bool dfs

(struct node * nodelist,

int x)

}return false;

}//判斷能否從中心小島直接跳到本結點(即判斷當前結點能否作為dfs搜尋的第乙個結點)

bool firststep

(struct node* node)

//主函式部分

intmain()

for(

int i =

0; i < n; i++)}

}if(set)

printf

("yes");

else

printf

("no");

return0;

}

深度優先搜尋DFS

作為搜尋演算法的一種,dfs對於尋找乙個解的 np 包括npc 問題作用很大。但是,搜尋演算法畢竟是 時間複雜度是o n 的階乘級演算法,它的效率比較低,在資料規模變大時,這種演算法就顯得力不從心了。關於深度優先搜尋的效率問題,有多種解決方法。最具有通用性的是剪枝 prunning 也就是去除沒有用...

深度優先搜尋 DFS

深度優先搜尋 縮寫dfs 有點類似廣度優先搜尋,也是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v 0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。你可以跳過第二節先看第三節,還是引用上篇文章的樣例...

深度優先搜尋(dfs)

深度優先搜尋的一般步驟 1 從頂點v出發,訪問v。2 找出剛才訪問過的頂點的第乙個未被訪問的鄰接點,訪問該頂點。以該頂點為新頂點,重複此步驟,直到剛訪問的頂點沒有沒有未被訪問過的鄰接點為止。3 返回前乙個訪問過的仍有未被訪問過的鄰接點的頂點,找出該頂點的下乙個未被訪問過的鄰接點,訪問該頂點。4 重複...