深搜有乙個基本的模板(當然我在深搜題解上,我都打了這個模板的):
int
search
(int t)
else}}
}
注意事項:
1.第乙個if是符合輸出解的條件,第二個if是符合進一步搜尋的條件;
2.下一步搜尋時,不是使用return search(t+1),直接search(t+1);(新手可能會注意不到這個關鍵的地方,以至於每次寫完不知道為什麼只得到乙個答案就返回主程式了)
3.for迴圈之後的if可以是多個;
4.for迴圈邊界,例如:
1>方向是四個,那麼邊界肯定就是4;
2>素數環需要嘗試1至20,那麼邊界就是20;
初學的時候,覺得很難記,因為整個模板有兩個if判斷,然後兩個if在剛開始學的時候就亂用(經常被教練罵,開個玩笑),直到看的深搜題多了,做的深搜題多了,慢慢地就對兩個if的實際用途有了一定的了解,那麼接下來我就詳細講講我的深搜心得:
兩個if實際上是有自己的工作和責任的;
第乙個if(也就是search下面的那個if)的作用是:判斷是否達到輸出的條件,如果達到了條件,就輸出解;
第二個if(也就是for迴圈下的那個if)的作用是:判斷是否達到了進一步搜尋的條件,如果達到了就進一步搜尋;
兩個if還是有本質上的差異的,上面的看不懂,我就舉乙個例子;
eg:走迷宮(從起始點到終點,不可以走回頭路,有障礙)
那麼第乙個if應該判斷的條件是是否到達了終點;
if(x==dx&&y==dy)//dx是終點的橫座標,dy是終點的縱座標;
那麼第二個if幹什麼用呢???
它就用來判斷走到下一步需要什麼要求
//這裡使用temp來標記自己走過的路,map上表示有無障礙;
if(temp[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1)//意思:自己沒有走過並且沒有障礙,那麼就可以往下一步走;
以上這就是兩個if的區別(當然for迴圈下的if可以有多個);
第二個可能有點模糊的地方就是for迴圈:
for迴圈的邊界是列舉的情況數
例如:素數環(題目問度娘啦)每乙個位置都可以放置1到20數字;一共有20種情況;所以迴圈的時候就是:
for(int i=1;i<=20;i++)
再例如迷宮的方向問題,總共就只有上下左右四個方向,那麼就可以將方向使用陣列打表,再乙個for迴圈:
int cx[4]=;//打表;
int cy[4]=;//打表;
for(int i=0;i<=3;i++)//初始值為0,所以邊界也要偏移乙個;
最後就是搜尋的執行順序,講起來非常地抽象,但是記住一句話:搜尋每深入一層,就把它看作是乙個平行宇宙,平行宇宙之間的變數互不干擾(全域性變數除外),例如:素數環的第乙個位置for迴圈中的變數i=3;進入下一步,for迴圈變數i還是從1開始的;而當返回到第乙個位置的時候,i的值就是3;也就是不同深度之間的同一變數(全域性變數除外)互不影響; 深搜的乙個性質
我們將每個節點的起始時間和結束時間對映到乙個時間軸上,正如圖二所示。括號引理 從a點的時間跨度範圍來看,如果我們經過深搜後能夠找到圖二所示的一棵樹 藍線和紅線所包圍的那棵 那麼在這棵樹中,任何乙個祖先的時間跨度範圍都會完完全全的包含其後代的時間跨度範圍 反之,任何乙個後代的時間跨度範圍都會完完全全的...
生日蛋糕 深搜 乙個關於剪枝的故事
不加剪枝見祖宗 關於本題剪枝 明確迴圈範圍 第n層r和h最小是n 否則第1層沒有餘地 最大是下面的一層 1 開始剪枝 2.老生常談 層數為先 3.卡體積 tj 當tj 0 return 當tj加上面還需要計算的rest層的最大仍不及n return 4.卡表面積 bj 當bj 已求minn 非解 r...
返回乙個參考的內部
我們把值時 smyarray,10 value 返回乙個參考的內部smyarray陣列第十元素。main 然後使用這些參考指定元素的值5。雖然這是有點做作的例子 因為你可以直接訪問smyarray.anvalue 一旦你了解課程你將發現更多的用途,通過引用返回值。返回位址 返回的返回位址到位址的變數...