李白打酒题目描述:
李白好饮酒,
无事街上走;
提壶去打酒,
原有酒两斗;
遇店加一倍,
遇花喝一斗。
- 问:李白在遇到五家店和十朵花以后,他壶中的酒恰好喝完,那么他遇到花和店的顺序是怎样的?
问题分析:
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;
}
八皇后问题执行结果: