搜尋專題 dfs and bfs

2021-08-21 10:35:19 字數 1230 閱讀 1891

搜尋,顧名思義,就是對某樣事物進行尋找。好了我就不多廢話了。搜尋有多種形式,常見的dfs(深度優先搜尋)和bfs(廣度優先搜尋)等等,這也就是今天的主要內容:

1.dfs:深度優先搜素,就相當於你去逛街,有很多條街相通,你選擇先走任意一條街,如果沒有自己想要去的店,那麼回到上乙個路口,再選擇一條沒走過的路繼續走到底。如:因式分解,即輸入n,求將n因式分解的總方案數。

首先,看到這題,我首先想到的是用遞迴去求n的各個因式,但當n足夠大時,這種遞迴寫法很顯然會超時,這時就要進行一定的優化了,考慮到n的因式可能還有因式,就不難想到,n的因式的總方案數也一定包括了n的因式的因式。這麼說有點繞口又有點難懂,那麼具體看看**:

#includeusing namespace std;

long long n,a[15000],b[15000],ghj=1;

int main()}}

sort(a+1,a+ghj);

for(int i=1;i看了這個,就可以很容易的想到n的因式之間的關係(雖然我沒用遞迴(*^__^*) 嘻嘻),知道了他們之間的關係後,就不難求出n的方案數了。(不得不說**是真的又臭又長)

2.dfs:廣度優先搜尋,就好比我現在要去洗手間,我要找一條最近的路,假設我有很多分身,那麼分身們向不同方向走去,在時間相同的情況下,第乙個到達洗手間的分身所走的路線一定是最短的(速度也相同)。典型題如:奇怪的電梯,從a樓到b樓,電梯在每個樓層所可以上公升或下降的層數不同,求出最少次數。

看完題目,我的第一反應就是模擬一下電梯的(鬼畜)移動,在既可上公升又可下降時,用bfs進行搜尋,具體**如下:

#includeusing namespace std;

int n,a,b,k[201]={},here,m,ans,minnest=1000000;

bool look[201]={};//標記,指該電梯是否到達過

void bfs(int here,int y)

if(here-k[here]>0&&look[here-k[here]]==false)//第一種情況:如果可以下降且下降後到達的樓層未曾到達過

if(here+k[here]<=n&&look[here+k[here]]==false)//第二種情況:如果可以上公升且上公升後到達的樓層未曾到達過  }

int main()

bfs(a,0);

if(minnest==1000000) cout<<"-1"《整個也就是個類似模擬,在電梯可以進行多種(兩種)情況的移動時分別模擬,最後得出最少次數。(仍然是又臭又長)

0825 0903搜尋專題

poj1321 棋盤問題 dfs,雖然並不知道書上或者模板裡的dfs是什麼樣子,但是大概了解。vj掛了 在上面下回再補poj2251 dungeon master 這道題很苦逼的做了好幾天,交了幾十發,用兩種方式均返回tle。然後搜題解,說是要用bfs,啃書,發現原來自己一直不會bfs。寬度優先搜尋...

搜尋專題 S

1 簡單描述 數獨,在乙個9x9的方格中,需要把數字1 9填寫到空格當中,並且使方格的每一行和每一列中都包含1 9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1 9這九個數字。2 思路 include using namespace std struct node node...

專題整理 搜尋

include include include include include include define n 500050using namespace std int maxn,minn void read int p intmain printf d minn printf d maxn r...