bfs广度优先搜索,本人的理解是把该思想的作用过程看作为一水波,在程序执行时,就像在水面投石形成的波纹,以扩散的形式遍历数据。
dfs深度优先搜索,可以理解为树根,每次遍历按规律一头到底,不行换下一个,如此递归,直到找到目标。
例题SDUTOJ 2779http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2779
DFS解法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Min 0x3f3f3f3f
char map[16][16];
int vis[16][16];
int mov[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
int min;
int n,m;
void DFS(int x,int y,int fen)
{
int i,a,b;
if(fen>=min)return ;
if(fen<min&&map[x][y]=='Y')
{
min=fen;
return ;
}
for(i=0;i<4;i++)
{
a=x+mov[i][0];
b=y+mov[i][1];
if(0<=a&&a<n&&0<=b&&b<m&&vis[a][b]==0&&
map[a][b]!='#')
{
vis[a][b]=1;
DFS(a,b,fen+1);
vis[a][b]=0;
}
}
}
int main()
{
int i,j;
while(~scanf("%d%d%*c",&n,&m))
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
gets(map[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]=='X')
break;
}
if(j!=m)break;
}
min=Min;
DFS(i,j,0);
if(min>=Min)printf("-1\n");
else printf("%d\n",min);
}
return 0;
}
BFS解法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char c[16][16];
int vis[16][16],n,m;
int mov[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct X
{
int x;
int y;
int fen;
}p[300],t,f;
void bfs(int x,int y)
{
int low=0,top=0;
int i,flag=0;
t.x=x;t.y=y;t.fen=0;
p[top++]=t;
vis[x][y]=1;
while(low<top)
{
t=p[low++];
if(c[t.x][t.y]=='Y'){
printf("%d\n",t.fen);
flag=1 ;
break;
}
for(i=0;i<4;i++)
{
f.x=t.x+mov[i][0];
f.y=t.y+mov[i][1];
if(0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&vis[f.x][f.y]==0&&
c[f.x][f.y]!='#')
{
f.fen=t.fen+1;
p[top++]=f;
vis[f.x][f.y]=1;
}
}
}
if(flag==0)
printf("-1\n");
}
int main()
{
int i,j;
while(~scanf("%d%d%*c",&n,&m))
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
gets(c[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(c[i][j]=='X')
break;
}
if(j!=m)break;
}
bfs(i,j);
}
return 0;
}