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