迭代加深搜尋 POJ3921

2021-09-03 10:43:50 字數 1143 閱讀 9103

自認為簡單的搜尋還是可以的,但是經過了這道題過後,我徹底否定自己了!這道題讓我看到了搜尋的境界:dfs(迭代)+bfs。

以前我一直以為圖論的題只能用圖論的演算法來做,而我做不出來,肯定是圖論的有些演算法沒學習好!這道題讓我看到了:圖論演算法的本質是搜尋。以前似乎在**聽到這樣的說法,但是沒注意,就算注意到了也沒有領悟到!回頭再寫迷宮的時候,發現其實迷宮其實也可以轉化成圖來進行搜尋。

這道題的思路是這樣的:先用bfs找到一條最短路,然後列舉刪除每個點。刪除點的時候,可以用迭代加深。先列舉所有刪除k個點的情況,如果無解,則列舉刪除k+1個點的情況!

#include

#include

#define mm 4010

#define mn 100

struct aaa; 

aaa edge[mm]; 

int head[mn],now; 

int n,m,k; 

bool rem[mn];//false表示該點沒刪除,true表示該刪除了

int path[mn]; 

int cpath[mn][mn]; 

int que[mn]; 

int ite;//表示迭代次數

int finds;//表示是否找到解

void init() 

void addedge(int s,int f) 

//在有向圖中利用廣度優先搜尋找路

void bfs() 

} if(path[n])break; 

} } 

void dfs(int deep) 

int lpos=-1; 

int v=n; 

while(v) 

if(lpos>k) 

if(deep>ite)return;//如果深度到了,也不用找了

for(int i=1;irem[cpath[deep][i]]=true; 

dfs(deep+1); 

rem[cpath[deep][i]]=false; 

} } 

int make() 

return n; 

} int main() 

printf("%d\n",make()); 

} return 0; } 

POJ 2248 迭代加深搜尋

a 0 1 a 1 2 之後每個數可以由前面的任意兩個數相加得到 可以是同乙個數 問得到數字n的最短序列 n最大為100,迭代加深搜尋打表 include stdio.h include string.h int w int pri 110 15 記錄答案 int len 110 數字n所需長度 i...

迭代加深搜尋

深度優先搜尋每次選定乙個分支,然後往下搜尋,直到遞迴邊界 才回溯。這種策略有一點缺陷,那就是當搜尋樹的分支數目特別 多,並且答案在某個較淺的節點上,如果dfs在一開始就選錯了分 支,那就會在沒有答案的深層次浪費時間 當搜尋樹規模隨著層次的深入增長很快,並且能 夠確保答案在乙個較淺的節點上時,就可以使...

迭代加深搜搜尋

對於可以用回溯法求解但解答樹的深度沒有明顯上限的題目,可以考慮使用迭代加深搜尋。經典問題 埃及分數問題 給出乙個分數,比如19 45,把它寫成若干個形如1 ri的分數的和的形式,比如19 45 1 5 1 6 1 18,要求分母不能重複使用並且使用的分數的個數最少。如果有多組個數相同的解,最後的分數...