广度优先搜索算法(英语:Breadth-First Search,缩写为BFS),又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。 这里以hdu 1312题为例 输入:多组数据,第 1 行包含两个正整数 W 和 H ,W 和 H 分别表示 x 方向和 y 方向上的瓷砖数量。 W 和 H 均不超过 20 ,W 和 H 为 0 时表示输入结束。下面有 H 行,每行包含 W 个字符。每个字符表示一片瓷砖的颜色。用符号表示如下:“ . ” 表示黑色瓷砖;“ # ”表示红色瓷砖;“ @ ” 表示黑色瓷砖上的人,在数据集中只出现一次。 输出:一个数字,这个人从初始瓷砖能到达的瓷砖的总数量(包括起点) 上述过程说明了整个搜索过程,下面用代码来实现: 参考文献:
BFS是一种盲目搜索法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能地址,彻底地搜索整张图,直到找到结果为止。实现
* 如果找到目标,则结束搜索并回传结果。
* 否则将它所有尚未检验过的直接子节点加入队列中。动态演示
详细解释
#include <iostream> #include <queue> using namespace std; char room[23][23]; int dir[4][2] = {{-1,0},{0,-1},{1,0},{0,1}};//四个方向,左上右下 int W,H,ans; //判断当前坐标是否在房间内 bool check(int x,int y){ return (x>=1 && x<=W && y>=1 && y<=H); } //存储点的坐标 struct node{ int x,y; }; void BFS(int dx,int dy){ ans = 1; //起点也包含在瓷砖内 queue<node> q; node start,nexted; start.x = dx; start.y = dy; q.push(start);//第一步的 1 进队 while(!q.empty()){//若队列q已经为空,说明已经搜索完毕 start = q.front(); q.pop(); for(int i=0;i<4;i++){//遍历当前位置的邻居 nexted.x = start.x + dir[i][0]; nexted.y = start.y + dir[i][1]; if(check(nexted.x,nexted.y) && room[nexted.x][nexted.y]=='.'){ room[nexted.x][nexted.y] = '#'; //进队后标记为已处理 ans++; q.push(nexted); } } } } int main() { int x,y,dx(0),dy(0); while(cin>>W>>H){ if(W==0 && H==0) break; for(y=1;y<=H;y++){ for(x=1;x<=W;x++){ cin>>room[x][y]; if(room[x][y] == '@'){ dx = x; dy = y; } } } ans = 0; BFS(dx,dy); cout<<ans<<endl; } return 0; }
算法竞赛-从入门到进阶(罗永军,郭卫斌著)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算