话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
解题思路:把所所有可能性都列出来,再一一判断。直接上代码,附带解释
/*
李白打酒??
????话说大诗人李白,一生好饮。幸好他从不开车。??
????一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:??
????无事街上走,提壶去打酒。?????
逢店加一倍,遇花喝一斗。??
????这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。???
????请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb?就是合理的次序。
像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。??
????注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。
*/
public class Test4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = new int[4];
fc(arr, 0); // 调用递归,抛入数组和下标
System.out.println(max); // 输出总数
}
public static void fc(int[] arr, int index) {
if (index > arr.length - 1) { // 边界,下标肯定不能超过数组的边界
// if (quan(arr)) {
for (int i : arr) { // 遍历数组
System.out.print(i);
}
System.out.println(); // 换行
// }
} else
for (int i = 0; i <= 1; i++) { // 用i的变化来模拟0和1
arr[index] = i; // i赋值到数组下标位index的
fc(arr, index + 1); // 方法调用本身,同时让下标往右移
}
}
static int max;//可行方法数
public static boolean quan(int[] arr) {
int h = 0, d = 0; // h=遇到花朵的数量,d=遇到店铺的数量
int jiu = 2; // 就的数量
for (int i : arr) { // 遍历
if (i == 0) { // 遇到花朵的情况
h++;
jiu--; // 酒总量减少1
} else { // 遇到店铺
d++;
jiu = jiu * 2; // 酒总量加倍
}
}
if (h == 10 && d == 5 &&
jiu == 0 && arr[14] == 0) {// 如果遇到的花朵=10,店铺=5,且酒也喝完了,最后遇到的也是花
max++;//可行方法+1
return true;
}
return false;
}
}