蓝桥杯问题,李白打酒

李白打酒  
话说大诗人李白,一生好饮。幸好他从不开车。  
一天,他提着酒壶,从家里出来,酒壶中有酒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;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值