李白喝酒问题中的深度优先搜索

    深度优先搜索算法从简单理解就是把所有可能的情况全部运行一遍,他就犹如一个分叉的树枝。从主干开始逐一经过每一个树枝。从某顶点开始依次访问该顶点相邻顶点。

    简单的的深度优先搜索算法需要掌握函数的递归的用法。及我们可以利用函数达到我们的目的。现在看下面这道例题:


话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
    无事街上走,提壶去打酒。
    逢店加一倍,遇花喝一斗。

这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。请计算所有可能? 


现在,我们对题目进行分析。假设遇到店的情况记为a,花的情况记为b。那么如 aaaaabbbbbbbbbb(5个a,10个b)这样的情况就是合理情况(当然它不符合题目的要求)。那么我们很容易的想到,我们能不能把每种可能的排列方式都进行一遍,然后在运行每种排列方式的同时判断它是否符合要求?问题来了,如何将每种情况都运行一遍?深度优先搜索就可以很好的解决我们的问题。
#include<stdio.h>

int possiblecount = 0;

void shensou(int count, int dian, int hua);
void possible(int cixu[15]);

int main(void){
	shensou(0, 0, 0);
	printf("%d", possiblecount);
	
	return 0;
}

void shensou(int count, int dian, int hua){
	static int cixu[15];
	
	if(count == 15){
		possible(cixu);
	}
	else{
		if(count != 14 && dian != 5){
			cixu[count] = 0;
			shensou(count + 1, dian + 1, hua);
		}
		if(hua != 10){
			cixu[count] = 1;
			shensou(count + 1, dian, hua + 1);
		}
	}
}
void possible(int cixu[15]){
	int i = 0;
	int jiu = 2;
	
	for(i = 0; jiu != 0 && i < 15; i++){
		if(cixu[i] == 0){
			jiu *= 2;
		}
		else{
			jiu --;
		}
	}
	if(jiu == 0 && i == 15){
		possiblecount ++;
	}
}


    这是我们例题的程序,通过之前的分析以及与本题的结合,我们发现最核心的算法就是 程序中的" shensou"函数:

void shensou(int count, int dian, int hua){
	static int cixu[15];
	
	if(count == 15){
		possible(cixu);
	}
		if(count != 14 && dian != 5){
			cixu[count] = 0;
			shensou(count + 1, dian + 1, hua);
		}
		if(hua != 10){
			cixu[count] = 1;
			shensou(count + 1, dian, hua + 1);
		}
	}
}

    此函数中运用到了数组,以及递归的思想。从函数上看,第一次所经历的的事件是aaaaabbbbbbbbbb。之后执行程序中函数"possible"的判断。

    无论possble函数是否可行,接下来就会进行到第二个情况的运行,及

aaaababbbbbbbbb。aaaabbabbbbbbbb。依次运行,直至所有情况都走完为止。

    

    本题的关键就是对深度优先搜索算法的理解。我把他归结是递归的一种妙用。当然,深度优先搜索算法并非如此简单。这是我根据题目对其进行浅释。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值