從根節點開始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,要求分母不能重複使用並且使用的分數的個數最少。如果有多組個數相同的解,最後的分數...