搜啊搜(论两种搜索方法)

搜索,是在编程学习中必须掌握的一种算法,在很多数据居中的题目中,都可以使用这种方法,其具体可以分为两种类型:


1、深搜(deep first search)

相当于二叉树中的先序遍历,可以点这个来查看一下----->点击打开链接,相当于遇到一个迷宫,朝一个方向一直走,知道不能走,再换一个方向继续试探,或者退一步,再换一个方向继续试探,这就叫做回溯算法

大致的结构如下:

void ill(int x,int y,int t)
{
	int i;
	t++;
	for(i=0;i<4;i++)
		if(check(x+w[i],y+u[i]))//看看这个方向能不能试探
		{
			v[a[x+w[i]][y+u[i]]]=1;//标记
			ill(x+w[i],y+u[i],t);//下一步
			v[a[x+w[i]][y+u[i]]]=0;//回溯
		}
	if(t>s)//达到要求就记录
		s=t;
}

深搜是很好想的方法,但其缺点就是太费时间,因为如果要找最短路,一般都会超时……

童鞋们可以去我的博客里找一下深搜关键词,我的一些题目都是关于深搜的,比如单词接龙~ ( ≧ ▽ ≦ ) /~


2、广搜

如果说深搜是指相同方向向前试探并记录的话,广搜就是把同一时间能够走的所有方向都check(记录)一下

广搜可以用队列来实现,如果你不知道队列,那你就低估了度娘的力量!!

当然也可以用数组,我个人推荐数组,耗时要小一点

大致代码如下:

int x,y,t=0,w=1,i;
	int h[100001][3];//用于记录的数组,要记录n种数据,就设h[k][n]
	h[1][0]=p;
	h[1][1]=q;
	h[1][2]=0;
	do
	{
		t++;//头部访问
		for(i=0;i<4;i++)
		{
			x=h[t][0]+z[i];
			y=h[t][1]+u[i];
			if(x>=0&&x<m&&y>=0&&y<n&&!v[x][y])
			{
				w++;//尾部记录
				h[w][0]=x;
				h[w][1]=y;
				h[w][2]=h[t][2]+1;
				v[x][y]=1;
				if(x==xz&&y==yz)//达到要求
				{
					num=h[w][2];
					return ;//达到要求直接返回,因为计算的是相等时间,所以第一个到的一定是最优解
				}
			}
		}
	}while(t<w);//直到能访问的点都访问完
比起深搜,广搜就会少耗时,但不要以为广搜是万能的,应当两种方法交替使用

也可以去我的博客里找一下广搜关键词,我还有一些题目都是关于广搜的,比如拯救行动~ ( ≧ ▽ ≦ ) /~

原文地址:https://www.cnblogs.com/Darknesses/p/12002571.html