深搜随想

深度搜索,Deep First Search,专门用来解决跟图啊、树啊相关的问题。而,作为一个大三结束的学生,没有一次当课上老师讲解完深搜后,能觉得自己会了。貌似记忆中,讲到深搜的机会不止十次,也不是同一个老师在讲,而每一次,基本上对深搜的讲解都是一样一样的,真不知道这些老师是不是事先“串通”好了。


现在暑假,一次偶然逛jd的时候,看到一本书《啊哈算法》。因为本身算法基础不好,而这本书又是一本入门的书籍,所以就买了下来。第二天,书到手了,稍微翻一下,确实跟买书前看到的评论一样:特别浅,特别适合初学者(好吧,我已经学了三年编程,结果算法我还是个初学,顶!)。


看完之后,对深搜确实理解比较深。书中说到,深搜其实只有三步:

一、边界值或临界值检查,记得return;

二、每一次深搜都要进行的步骤(比如走迷宫,每一次深搜,都要对四个方向进行判断);

三、dfs(next step)和return;


下面贴出一个实例,以供理解

#include <stdio.h>
#include <stdlib.h>

int a[9], book[10], total = 0, n;

void dfs(int step)
{
	if (step == n + 1)
	{
		if (a[0] * 100 + a[1] * 10 + a[2] + a[3] * 100 + a[4] * 10 + a[5] == a[6] * 100 + a[7] * 10 + a[8])
		{
			total++;
			printf("%d + %d = %d\n", (a[0] * 100 + a[1] * 10 + a[2]), (a[3] * 100 + a[4] * 10 + a[5]), (a[6] * 100 + a[7] * 10 + a[8]));
			return;
		}
	}

	for (int i = 0; i < 10; i++)
	{
		if (book[i] == 0)
		{
			a[step] = i;
			book[i] = 1;
			dfs(step + 1);
			book[i] = 0;
		}
	}

	return;
}


int main()
{
	for (int i = 0; i < 10; i++)
	{
		a[i] = 0;
		book[i] = 0;
	}
	n = 9;
	dfs(1);
	printf("total=%d\n", total/2);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值