蓝桥杯题——李白打酒
public class 李白打酒2 { static int a=2; static int count = 0; public static void fun(int m,int n,int a,int i)//m代表店铺,n代表花,a代表酒 { if(n<0 ||m<0) return; if(i == 14) { if(a == 1) count++; return; } for(int ii=0;ii<=1;ii++) { if(ii==0)//遇到花 { fun(m, n-1, a-1, i+1); } else { fun(m-1, n, a*2, i+1); } } } public static void main(String[] args) { // TODO Auto-generated method stub fun(5, 9, 2,0); System.out.print(count); } }
public class 李白打酒 { static int a = 2;//一开始就只有2斗酒 static int count=0; static int art[] = new int [15]; public static void print() { for(int i:art) { System.out.print(i); } System.out.println(); } public static boolean add(int sum)//输出满足条件的 { int b=0;//代表经过店的数量 for(int i=0;i<15;i++) { if(art[i] == 0)//遇到花 sum -=1; else { b++; sum = sum*2; } } if(sum == 0 && b==5 && art[14] == 0)//最后一次喝完,且遇到花,且只经过5家店铺 { count++; return true; } return false; } public static void fun(int n ) { if(n == 15) { if(add(2) )//刚好为0,并且只经过5次店 print(); //print(); return; } for(int i=0;i<=1;i++) { art[n] = i; fun(n+1); } } public static void main(String[] args) { // TODO Auto-generated method stub fun(0); System.out.println(count); } }
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
1.把a可以看做是1,把b可以看做是0。所以最大是111110000000000,最小是000000000011111。
2,把这些15位的二进制,转换成十进制。反过来在代码中用十进制转换成二进制就可以得到所有情况。
3,按要求把符合的输出。
#include <iostream.h> int art[15]; int sum; void fun(long aa)//把十进制转换成二进制 { int f = 0; while(aa!=0) { art[f] = aa%2; sum += art[f]; aa = aa/2; f++; } } void main() { long t ; for(t=15768;t<30768;t++) { int Li = 2;//最初的两斗酒 sum = 0; fun(t); if(sum==5) { for(int i=14;i>0;i--) { if(art[i] == 0) { Li = Li-1; } else { Li = Li*2; } if(Li<0) { break; } } if(Li==1) { for(i=14;i>=0;i--) { if(art[i] == 1) cout<<'a'; else cout<<'b'; } cout<<endl; } } } }
结果
abbbabaabbabbbb
abbbaabbbaabbbb
abbbaabbabbbabb
abbbaaabbbbbbba
abbabbbabaabbbb
abbabbbaabbbabb
abbabbabbbababb
abbabbababbbbba
abbababbbbabbba
abbaabbbbbbbaba
ababbbbbabababb
ababbbbabbabbba
ababbbabbbbbaba
aabbbbbbbaabbba
aabbbbbbabbbaba
解法2,不用二进制,直接用递归来生成所有情况。
#include <iostream> #include <string> using namespace std; int a[14]; int N; void Print() { for(int i=0;i<14;i++) { cout<<a[i]<<" "; } cout<<endl; } int Add() { int sum = 0; for(int i=0;i<14;i++) { sum += a[i]; } return sum; } int F(int n) { for(int i=0;i<14;i++) { if(a[i] == 0)//代表遇到花 n--; else n = n*2; } return n; } void fun(int m,int n) { if(m == 14) { if(Add()==5) { if(F(n) == 1) { Print(); N++; } } return ; } for(int i=0;i<2;i++)//用零表示花,用1表示店 { a[m] = i; fun(m+1,n); } } int main() { memset(a,0,sizeof(a)); int n = 2;//开始是2 fun(0,n); cout<<N<<endl; }