深度優先搜尋之李白打酒

2021-09-12 07:50:16 字數 1684 閱讀 7447

1. 問題描述:

話說大詩人李白,一生好飲。幸好他從不開車。

一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱:

無事街上走,提壺去打酒

逢店加一倍,遇花喝一斗

這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把酒喝光了

請你計算李白遇到店和花的次序,可以把遇店記為a,遇花記為b。則:babaabbabbabbbb 就是合理的次序。像這樣的答案一共有多少呢?請你計算出所有可能方案的個數(包含題目給出的)

注意:通過瀏覽器提交答案。答案是個整數。不要書寫任何多餘的內容

2. 思路分析:

① 分析題目我們可以知道這個是乙個試探性的過程,對於當前的狀態我們可以遇到花,也可以遇到店,每一次都是在嘗試著兩種選擇,最後的結果是遇到店是5次,遇到花是10次,所以我們對於這一類的試探性問題都是可以使用深度優先搜尋來進行解決的,假如使用其他的方法是很難解出來的

② 確定了解決問題的演算法之後,我們需要首先要進行解決的是dfs的方法中傳入的引數,需要抓住的一點是傳入的引數應該是動態進行變化的,由題目中可知我們可能遇到花,也可能遇到店所以是花的數量與店的數量在變化,而且酒的數量也在變化,並且酒的數量需要在最後的時候計算校驗的,所以也需要記錄起來,這樣目前需要記錄的變數就有三個,所以不妨把這三個變數先傳進來dfs方法中,假如在呼叫的過程中發現不夠再加入其它的變數

③ 第二個需要進行解決的是平行狀態的確定,意思是我們在當前狀態下可以有多少種的選擇,從題目中明顯可以看出我們在當前狀態下存在兩種選擇,所以自然就有兩個平行狀態,所以有兩個dfs方法的遞迴呼叫,由於為了在最後驗算自己的結果是否正確所以可以在dfs方法中傳入乙個字串來記錄中間的過程,等到遇到出口的時候輸出最後的結果看是否正確

⑤ 第三個是遞迴出口的設計,顯然在題目中我們遇到店和花的數量總共為14次的時候就應該判斷一下了,因為最後一次遇到的是花所以總共14次就好了,由於在上一次中我們使用了字串來進行記錄,使用字串進行記錄的好處不僅在於能夠記錄中間過程,而且可以在出口的時候判斷字串的長度是否等於了14,這樣就可以少宣告乙個變數來進行記錄了

所以在出口前應該判斷花的數量是否滿足9,店的數量是否滿足5,酒的數量是否等於1,滿足了上面的條件之後可以輸出相應的字串,上面的判斷之後假如字串的長度已經大於了14說明已經不符合結果直接return就好了

⑥ 而且這道題目不需要進行回溯因為平行狀態下是沒有影響的,對於陣列型別的這一類的對於元素的操作往往才是需要進行回溯的

⑦ 由於存在著兩個平行狀態,所以我們在想的時候也可以將其想象成一棵二叉樹來進行解決,遞迴左子樹與右子樹

總結一下:使用深度優先搜尋的方法大概就是上面所說的,當我們做的題目比較多的時候對於這一類的題目自然會想到使用dfs來解決

3. **如下:

public class main 

private static void dfs(int flower, int store, int wine, string cur)

if(cur.length() >= 14) return;

//遇到花

dfs(flower + 1, store, wine - 1, cur + "b");

//遇到店

dfs(flower, store + 1, wine * 2, cur + "a");

}}

李白打酒 DFS

話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱 無事街上走,提壺去打酒。逢店加一倍,遇花喝一斗。這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,可以把遇店記為a,遇花記為b。則 ba...

李白打酒問題

近日準備藍橋杯大賽,看到乙個李白打酒的問題,題目如下 話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱 無事街上走,提壺去打酒。逢店加一倍,遇花喝一斗。這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇...

2507 李白打酒

問題及 話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱 無事街上走,提壺去打酒。逢店加一倍,遇花喝一斗。這一路上,他一共遇到店m次,遇到花n次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,可以把遇店記為a,遇花記為b。例...