當普通dfs搜尋答案時,有時會有搜尋的深度較深狀態較多,而答案所在的深度卻比較小的情況。比如說下面這個圖中,目標狀態是紅框的那個點,它的深度很小,但是左側有很多的狀態,普通dfs必須要搜完左側所有狀態才會搜到目標狀態,這樣就很容易超時。對此可以在dfs的時候限定乙個深度的狀態,這個深度是從小到大列舉的,直到搜到答案。
如果我們限定dfs的深度是1,那麼就只有兩個狀態,目標狀態第二次就搜到了,實現了dfs的優化。
但是個人認為這個演算法還是只能對一些特定的題目有效,即目標狀態的深度要小一點,否則優化的效率不大,極端情況下,目標狀態的最深最右邊的,反而用的時間會更長。
入門例題:hdu2234
題意:給出乙個4*4的矩陣,裡面只有4個1,4個2,4個3,4個4,問能否在5步內將矩陣恢復成每列相同或每行相同。
思路:直接對給出的矩陣進行dfs,深度從1開始列舉到5即可。改變矩陣寫起來比較麻煩不知道有沒有什麼更好的辦法。
#include
using namespace std;
int mp[5]
[5];
bool judge()
//判斷矩陣是否每列相同或每行相同if(
!f1)
break;}
if(f1)
return true;
for(
int i=
1;i<=
4;i++)if
(!f2)
break;}
return f2;
}void
rote
(int dir,
int xb,
int fx)
//改變矩陣,共16種策略,dir表示行或列,xb表示第幾行或第幾列,fx表示正或反
else
}else
else}}
bool dfs
(int step)
bool ret=0;
for(
int i=
1;i<=
4;i++
)//列舉第幾行或第幾列
return ret;
}int
main()
//如果搜到了就退出迴圈
}printf
("%d\n"
,ans);}
return0;
}
飛彈防禦系統(迭代加深dfs 貪心)
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就可以將它...
迭代加深 索道
這天,tom帶一群小朋友們去爬山。經歷了千辛萬苦,小朋友們終於爬上了山頂,但是疲倦的他們再也不想徒步走下山了。tom只好花錢讓它們坐索道下山。索道上的纜車最大承重量為w,而n個小朋友的重量分別是c1 c2 cn。當然,每輛纜車上的小朋友的重量之和不能超過w。每租用一輛纜車,tom就要付1美元,所以他...
迭代加深搜尋
深度優先搜尋每次選定乙個分支,然後往下搜尋,直到遞迴邊界 才回溯。這種策略有一點缺陷,那就是當搜尋樹的分支數目特別 多,並且答案在某個較淺的節點上,如果dfs在一開始就選錯了分 支,那就會在沒有答案的深層次浪費時間 當搜尋樹規模隨著層次的深入增長很快,並且能 夠確保答案在乙個較淺的節點上時,就可以使...