广度搜索的基本使用方法
广度搜索不同于深度搜索,是一种一步一步进行的过程,每一个点只记录一遍。需要用到队列记录每一步可以走到的位置,找到目标位置输出步数即可。
用到的知识:结构体、队列
如图
首先我们需要定义一个结构体来存储每个遍历到的点和步数
struct node{
int x;
int y;
int s;
};
广搜不会用到递归,所以可以直接在主函数里写,这里需要定义一个结构体队列
struct node que[2501]; //我们设置边界为50,所以队列大小取50平方即可
int a[51][51]={0}; //我们设置1为墙,0为路径,int类型即可,当然,字符类型也可
int b[51][51]={0}; //b数组用来记录走过的点
int i,j,tx,ty,k,n,m,p,q,head,tail,startx,starty,flag=0;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //列举四个方向
scanf("%d %d",&n,&m); // 取行和列
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d %d %d %d",&startx,&starty,&p,&q);
初始化队列并将起始点入列
head=1;
tail=1;
que[tail].x=startx;
que[tail].y=starty;
que[tail].s=0;
tail++;
b[startx][starty]=1;
遍历
while(head<tail) //当队列不为空时
{
for(k=0;k<=3;k++) //按照顺时针方向,右下左上遍历头的下一个点
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1 || tx>n || ty<1 || ty>m) //判断是否越界
continue;
if(a[tx][ty]==0 && b[tx][ty]==0) //判断是否可行及是否走过
{ // 将点入列
b[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1; //下一个点需要的步数是上一个点的步数+1
tail++;
}
//判断是否找到目标点
if(tx==p && ty==q)
{
flag=1; //这两句不可颠倒
break;
}
}
if(flag==1)
break;
head++; //很重要,头+1,遍历下一个
}
if(flag==1) //如果可以找到目标点,输出最少步数
printf("Escaped at least %d minute(s)\n",que[tail-1].s);
else //否则被困住
printf("Trapped!\n");
完整代码
#include<stdio.h>
struct node{
int x;
int y;
int z;
int s;
};
int main()
{
struct node que[2701];
char a[32][32][32];
int b[32][32][32]={0};
int next[6][3]={{0,0,1},{0,1,0},{1,0,0},{0,0,-1},{0,-1,0},{-1,0,0}};
int n,m,c,i,j,k,startx,starty,startz,head,tail,tx,ty,tz,p,q,d,flag=0;
scanf("%d %d %d",&n,&m,&c);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%s",a[i][j]);
for(k=0;k<c;k++)
{
if(a[i][j][k]=='S')
{
startx=i;
starty=j;
startz=k;
}
if(a[i][j][k]=='E')
{
p=i;
q=j;
d=k;
}
}
}
head=1;
tail=1;
b[startx][starty][startz]=1;
que[tail].x=startx;
que[tail].y=starty;
que[tail].z=startz;
que[tail].s=0;
tail++;
while(head<tail)
{
for(k=0;k<=5;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
tz=que[head].z+next[k][2];
if(tx<0 || tx>n-1 || ty<0 || ty>m-1 || tz<0 || tz>c)
continue;
if(a[tx][ty][tz]!='#' && b[tx][ty][tz]==0)
{
b[tx][ty][tz]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].z=tz;
que[tail].s=que[head].s+1;
tail++;
}
if(tx==p && ty==q && tz==d)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
if(flag==1)
printf("Escaped at least %d minute(s)\n",que[tail-1].s);
else
printf("Trapped!\n");
return 0;
}```
以上