藍橋杯 李白打酒

2021-07-09 05:21:21 字數 1833 閱讀 4652

題目

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

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

無事街上走,提壺去打酒。

逢店加一倍,遇花喝一斗。

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

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

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

分析

這是乙個典型的需要用遞迴模擬的題目,我們需要做的是分析出在這一過程當中變化的地方抽為引數,然後分析出所有的遞迴出口。

原始碼

public class test011 

// jiu表示還剩多少斗酒,店表示還剩多少次店,hua表示還剩多少次花

private static void libai(int step, int jiu, int dian, int hua)

if (step == 0 && jiu == 1 && dian == 0 && hua == 1)

libai(step - 1, jiu - 1, dian, hua - 1); // 遇到花了

libai(step - 1, jiu * 2, dian - 1, hua); // 遇到店了

}}

結果

14種情況

列印所有可能性原始碼

private static hashsetsets;

public static void main(string args)

} // c陣列代表經過的資料,jiu表示剩下的酒,step表示已經走了多少步,dian表示遇到了店的次數,hua表示遇到了花的次數,isdian位true表示下次遇到店

private static void hj(char c, int jiu, int step, int dian, int hua,

boolean isdian)

if (dian > 5)

if (hua > 10)

//*********遞迴出口*********

if (isdian) else

//遞迴出口

if (step == 14)

return;

} //下一次遇到的是店

hj(c, jiu * 2, step + 1, dian + 1, hua, true);

//下一次遇到的是花

hj(c, jiu - 1, step + 1, dian, hua + 1, false);

}

結果

14abbbaabbabbbabb

ababbbbbabababb

baabbabbbaabbbb

abbbaabbbaabbbb

baababbbbbababb

abbbabaabbabbbb

abbabbabbbababb

babaabbabbabbbb

bababaababbbbbb

babaababbbbbabb

abbabbbaabbbabb

baabbbaabbabbbb

abbabbbabaabbbb

baabbabbabbbabb

藍橋杯 李白打酒

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

藍橋杯 李白打酒

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

藍橋杯 李白打酒

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