李白打酒 --- 蓝桥杯

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值