您的位置:首页 > 其它

广度搜索BFS hdu-1312

2015-08-08 07:24 260 查看
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;

int W,H;
char maze[20][20];
int S_x,S_y;
int sign[20][20];
int x_dir[4]={0,0,1,-1},y_dir[4]={-1,1,0,0};
int number;
typedef struct point
{
int x;
int y;
}POINT;

void bfs(int S_x,int S_y)
{
memset(sign,0,sizeof(sign));
queue<POINT> p;
POINT S_point;
S_point.x=S_x,S_point.y=S_y;
p.push(S_point);
sign[S_point.y][S_point.x]=1;
while(!p.empty())
{
POINT T_point;
T_point=p.front();
p.pop();
number++;
POINT N_point;
for(int i=0;i<4;i++)
{
N_point.x=T_point.x+x_dir[i];
N_point.y=T_point.y+y_dir[i];
if(N_point.x<0||N_point.x>=W||N_point.y<0||N_point.y>=H||sign[N_point.y][N_point.x]||(maze[N_point.y][N_point.x]=='#')) continue;
p.push(N_point);
sign[N_point.y][N_point.x]=1;
}
}
}

int main()
{
while(scanf("%d %d",&W,&H)&&W+H)
{
for(int i=0;i<H;i++)
{
scanf("%s",maze[i]);
for(int j=0;j<W;j++)
{
if(maze[i][j]=='@')
{
S_x=j,S_y=i;
break;
}
}
}
bfs(S_x,S_y);
printf("%d\n",number);
number=0;
}
return 0;
}

      方法:广度优先搜索先穷竭遍历某定点的上下左右四个方向,将满足不越界,不碰墙,没走过的点全部入队,再在下次循环时判断队列是否为空,非空则说明有满足条件不越界,不碰墙,没走过的点,然后在遍历该点的值的上下左右四个方向重复上述操作;

     队列应用:在该题中队列起了储存满足条件的点和判断广度搜索函数bfs是否需要继续运行的作用;队列包含在头文件<string.h>中,且只存在于C++中;

    memset应用:起到初始化数组的作用,将某个数组的每个元素变为同一个值;

    自定义数组sign[20][20]作用:判读该点有无走过,走过则为1,未走过则为0;

    队列中各函数作用:queue<b>a初始化b类型的a队列,push(a)将a放入队列,front从底部读取(先进先出)第一个元素的数值(该元素仍留在队列中),pop从底部取走第一个元素(该元素被取走),a.empty()判断队列是否为空;

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs 个人