经典递归算法

李白打酒题目描述:

李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。

  • 李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?

问题分析:

1、酒壶刚开始酒为2斗;

2、遇到店酒的量会翻倍(*2),遇到话会喝一斗(-1);

3、总共遇到店5次,花10次。最后一次肯定是遇花;

上述分析可得明显的递归问题,用一般算法分析特别麻烦,实现代码如下:

#include <stdio.h>

#define IFLOWER	10		//花次数
#define ISTROE	5		//店次数
#define IWINE	2		//酒

int tatol = 0;			//总共种数	

char libai[16] = {0};	//存储遇店跟花的顺序


void libaiDrink(int wine, int flower, int stroe, int iTag)
{
	if(wine == 1 && flower == 1 && stroe == 0)	//当酒剩1斗,花剩1次,最后刚好
	{
		libai[15] = 'a';	//表示最后一次遇花
		tatol++;
		printf("%s\n", libai);
		return;
	}
	
	if(wine > 0 && stroe > 0)
	{
		libai[iTag] = 'b';	//'b'表示遇店
		libaiDrink(wine * 2, flower, stroe - 1, iTag + 1);	//遇见店,酒加1倍	
	}
	
	if(wine > 0 && flower > 1)
	{
		libai[iTag] = 'a';	//'a'表示遇花
		libaiDrink(wine - 1, flower - 1, stroe, iTag + 1);	//遇见花,酒减1斗
	}
}

int main()
{
	libaiDrink(IWINE, IFLOWER, ISTROE, 0);
	
	printf("tatol : %d\n", tatol);
	return 0;
}

李白打酒执行结果:

八皇后题目描述:

如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

  • 总共有多少种摆法?

问题分析:

1、这种摆法应该一行一行摆;

2、每行有8种摆法;

3、每次摆的地方不能与之前摆的位置有纵向或者交叉项的重复;

上述分析可知该问题为明显的递归问题,实现代码如下:

#include <stdio.h>

#define N       8

int ret[N] = {0};    //该数组存放每行存入皇后的列

int is_ok(int row)
{
	int i = 0;
	for(i = 0; i < row; i++)
	{
                //保证该皇后放的位置与之前的不在同列及交叉列
		if(ret[i] == ret[row] || ret[row] - ret[i] == row - i || ret[row] - ret[i] == i - row)
			return 0;
	}
	return 1;
}


void queen(int row)
{
	int i = 0;
        if(row == N)    //8皇后均已合法入列
	{
		for(i = 0; i < N; i++)
		{
			printf("%d ", ret[i]);
		}
		printf("\n");
	}
	else{
		for(i = 0; i < N; i++)    //该row皇后每列进行尝试入列
		{
			ret[row] = i;

			if(is_ok(row))
				queen(row + 1);
		}
	}
}


int main()
{
	queen(0);
	return 0;
}

八皇后问题执行结果:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值