图的搜索(bfs)
2016-03-30 14:15
309 查看
一般解决最短路程,最少步数的时候用bfs,bfs用到队列(先进先出),进行一层一层的搜索,其实bfs之所以能更好的解决最短路问题我觉得就是因为他是一层一层的去搜索。比如,他是先把第一步能走到的格子都入队,然后又以第一步走到的那个格子为基础,第二步能走到的格子在入队,直到找到终点。
下面以一个题目为例,讲一下二维图像上的bfs。
题目描述:
代码:
下面以一个题目为例,讲一下二维图像上的bfs。
题目描述:
代码:
#include<cstdio> #include<iostream> #include<queue> #include<string.h> using namespace std; struct node { int x,y;//x,y表示坐标 int t;//t表示当前步数 }; queue<node> q; node s,f; char a[110][110]; char vis[110][110]; int xx[4]={1,0,0,-1}; int yy[4]={0,-1,1,0}; int n; int bfs() { int i,j; q.push(s);//起点入队 vis[s.x][s.y]=1;//起点标为已经搜索过 while(!q.empty()) { node now=q.front(); for(i=0;i<4;++i)//搜索每个能达到的当前点的周围四个点 { node New; New.x=now.x+xx[i]; New.y=now.y+yy[i]; New.t=now.t+1;//都是当前点通过一步走过去的 if(New.x<0||New.x>=n||New.y<0||New.y>=n||a[New.x][New.y]=='#'||vis[New.x][New.y]==1) continue;//如果越界或者这个点已经走过或者是障碍则跳过 q.push(New);//新走到的格子入队 vis[New.x][New.y]=1;//标记为已走过 if(New.x==f.x&&New.y==f.y) return New.t;//如果到达终点 } return -1; } } int main() { int t; scanf("%d\n",&t); while(t>0) { int ans; int i,j; scanf("%d",&n); getchar();//吃回车 for(i=0;i<n;++i) { for(j=0;j<n;++j) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { s.x=i;s.y=j; } else if(a[i][j]=='*') { f.x=i;f.y=j; } } getchar();//吃回车 } memset(vis,0,sizeof(vis));//标记搜没搜过的数组每次都要重置 s.t=0;//起点步数为零 ans=bfs(); if(ans>0) printf("%d",ans); else printf("MISSION FAILED"); t--; } return 0; }
相关文章推荐
- BOE 不能登录问题
- 学生如何提高专业英文阅读能力--施一公教授
- hadoop安装
- 技术分享:如何用Solr搭建大数据查询平台
- centos 6.6下搭建lamp
- Linux文件系统破坏,导致系统无法启动解决办法
- 关于python3.x读取写入文件时编码报错问题
- 【华容道】题解(NOIP2013提高组day2)
- SpringMVC +mybatis in 查询不报错但是没有结果
- python常用的特殊属性总结
- 360在线编程题
- Java中读取 properties 文件
- HttpUtils
- 未能加载文件或程序集“”或它的某一个依赖。找到的程序集清单定义与程序集引用不匹配。
- Date、Calender、DateFormat
- RelativeLayout,LinearLayout,FrameLayout的各个属性
- android获取屏幕的高低
- iOS Swift和OC混编
- hdu 1166 敌兵布阵(线段树单点更新求和)
- 细述Telnet与SSH两大协议的区别