广度搜索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()判断队列是否为空;