迭代加深搜尋(iddfs)

2021-10-05 17:53:31 字數 2651 閱讀 8552

從根節點開始dfs

dfsdf

s,用乙個變數dep

depde

p限制dfs

dfsdf

s的深度,一旦達到dep

depde

p層,那麼就看是否找到目標;如果在dep

depde

p層沒有搜尋到目標,那麼就將深度的限制dep

+1

dep+1

dep+

1,繼續從根節點重新開始dfs

dfsdf

s,如此反覆直到找到目標,或者證明目標不存在;

能夠從題目中推斷出答案的層次較淺;

整個搜尋樹非常的深而且隨著深度的增加,結點增加非常快速;

相比於dfs,防止一條路走到底,避免超時

相比於bfs,防止在佇列中儲存的狀態過多,避免超空間;

每一次都需要從根節點重新開始搜尋,會導致重複;

bool

dfs(

int cur)

for(cur的鄰居)

}return

false;}

intmain()

}

思路:

注意,需要剪枝,分別是排除重複以及優化搜尋順序

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

105;

const

int inf=

0x3f3f3f3f

;int n,dep;

int ans[maxn]

;inline

intread()

c=getchar()

;}while

(c>=

'0'&&c<=

'9')

return s*f;

}inline

void

write

(int x)

if(x>9)

putchar

(x%10

+'0');

}inline

bool

dfs(

int cur)

//目前已經在位置1到cur找到結果

bool vis[maxn]=;

//排除重複(剪枝)

for(

int i=cur;i>=

1;i--

)//優化搜尋順序(剪枝)

else}}

}return

false;}

intmain()

dep=1;

while

(dfs(1

)==false

)for

(int i=

1;i<=dep;i++

)puts(""

);}return0;

}

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

100005

;const

int inf=

0x3f3f3f3f

;int n,dep;

int ans[maxn]

;inline

intread()

c=getchar()

;}while

(c>=

'0'&&c<=

'9')

return s*f;

}inline

void

write

(int x)

if(x>9)

putchar

(x%10

+'0');

}inline

bool

dfs(

int cur)

int maxi=

-inf;

for(

int i=

1;i<=cur;i++)if

((maxi<<

(dep-cur)

)for(

int i=cur;i>=

0;i--

) ans[cur+1]

=ans[cur]

-ans[i];if

(dfs

(cur+1)

==true)}

return

false;}

intmain()

dep=0;

ans[0]

=1;while

(dfs(0

)==false

)write

(dep)

;puts(""

);}return0;

}/*131

7091

473512

811953

0*/

IDDFS迭代加深搜尋

includeusing namespace std const int maxn 10 int n,a maxn bool ans sort return true int h bool dfs int d,int maxd return false int solve return max an...

迭代加深搜尋

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

迭代加深搜搜尋

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