搜索,是在编程学习中必须掌握的一种算法,在很多数据居中的题目中,都可以使用这种方法,其具体可以分为两种类型:
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);//直到能访问的点都访问完
比起深搜,广搜就会少耗时,但不要以为广搜是万能的,应当两种方法交替使用
也可以去我的博客里找一下广搜关键词,我还有一些题目都是关于广搜的,比如拯救行动~\ ( ≧ ▽ ≦ ) /~