话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。
1.递归解法
#include<stdio.h>
int ans[16], sum = 0;
void dfs(int hua, int dian, int jiu, int n)
{
int i;
if(n == 16)
{
if(hua == 10 && dian == 5 && jiu == 0 && ans[15] == 1)
{
sum ++;
for(i = 1; i < 16; i ++)
printf("%c ",ans[i] + 'a');
printf("\n");
}
}
else
{
ans[n] = 0;
dfs(hua,dian+1,jiu*2,n+1);
ans[n] = 1;
dfs(hua+1,dian,jiu-1,n+1);
}
}
int main()
{
dfs(0,0,2,1);
printf("%d\n",sum);
return 0;
}
2.暴力破解解法
#include<stdio.h>
int main()
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13;
int a[15]={0}, dian = 0, jiu = 2, hua = 0, count = 0, i = 0, j = 0;
a[14] = 1;
for(x0 = 0; x0 <= 1; x0 ++)
{
a[0] = x0;
for(x1 = 0; x1 <= 1; x1 ++)
{
a[1] = x1;
for(x2 = 0; x2 <= 1; x2 ++)
{
a[2] = x2;
for(x3 = 0; x3 <= 1; x3 ++)
{
a[3] = x3;
for(x4 = 0; x4 <= 1; x4 ++)
{
a[4] = x4;
for(x5 = 0; x5 <= 1; x5 ++)
{
a[5] = x5;
for(x6 = 0; x6 <= 1; x6 ++)
{
a[6] = x6;
for(x7 = 0; x7 <= 1; x7 ++)
{
a[7] = x7;
for(x8 = 0; x8 <= 1; x8 ++)
{
a[8] = x8;
for(x9 = 0; x9 <= 1; x9 ++)
{
a[9] = x9;
for(x10 = 0; x10 <= 1; x10 ++)
{
a[10] = x10;
for(x11 = 0; x11 <= 1; x11 ++)
{
a[11] = x11;
for(x12 = 0; x12 <= 1; x12 ++)
{
a[12] = x12;
for(x13 = 0; x13 <= 1; x13 ++)
{
a[13] = x13;
for(i = 0; i <= 14; i ++)
{
if(a[i] == 0)
{
jiu *= 2;
dian ++;
}
if(a[i] == 1)
{
jiu -= 1;
hua ++;
}
if(hua == 10 && dian == 5 && jiu == 0)
{
count ++;
for(j = 0; j < 15; j ++)
{
printf("%c ",a[j] + 'a');
}
printf("\n");
}
}
jiu = 2;
dian = 0;
hua = 0;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
printf("共有 %d 种情况\n",count);
return 0;
}
答案:14