第三题:李白打酒
话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
思路:已知最后一次遇到的是花,他正好把酒喝光了,所以前面14次遇到店5次,花9次,酒剩一斗。
两种方法:
1:暴力:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main (){
char str[]="aaaaabbbbbbbbb";
int sum;
while(next_permutation(str,str+14)){
sum=2;
for(int i=0;i<14;++i){
if(str[i]=='a')
sum=sum*2;
else if(str[i]=='b')
sum=sum-1;
}
if(sum==1)
printf("%s\n",str);
}
return 0;
}
2:DFS
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[20];
int d1,d2;
void dfs(int pos,int sum){
int i;
if(pos==15 && sum==1 && d1==5 && d2==9){
for(i=1;i<=14;++i)
printf("%d",a[i]);
printf("\n");
return ;
}
if(pos>=15) return ;
a[pos]=1;
d1++;
dfs(pos+1,sum*2);
d1--;
a[pos]=0;
d2++;
dfs(pos+1,sum-1);
d2--;
}
int main (){
d1=d2=0;
dfs(1,2);
return 0;
}
结果:14种
ababbbbbababab
abbabbabbbabab
abbabbbaabbbab
abbabbbabaabbb
abbbaabbabbbab
abbbaabbbaabbb
abbbabaabbabbb
baababbbbbabab
baabbabbabbbab
baabbabbbaabbb
baabbbaabbabbb
babaababbbbbab
babaabbabbabbb
bababaababbbbb