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


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


    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);//直到能访问的点都访问完
    比起深搜,广搜就会少耗时,但不要以为广搜是万能的,应当两种方法交替使用

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

  • 相关阅读:
    项目经理所需要具备的素质
    项目经理的个人修养
    项目拖期怎么办
    创业起步的十大准备步骤
    注册(创办)公司的手续过程
    如何让女人每天更快乐
    全面比较:中美两国百姓的生活成本
    ADO.NET级别的事物
    respondsToSelector的使用
    用js在两个页面之间传值
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002571.html
Copyright © 2020-2023  润新知