bfs(广搜)

来源:互联网 发布:jersey接收json 编辑:程序博客网 时间:2024/04/28 18:32

学长给我们讲广搜的ppt太帮了,通过动态模拟进队列,访问,退出队列,让我明白了bfs的基本思想微笑。bfs通常解决最小步数是多少的问题,只能标记,无法取消标记,不像dfs。通过bfs,第一次找到的解决方案,就是耗费最小的方案。

广搜代码实现:

void bfs(int u){memset(vis,0,sizeof(vis));queue<int>q;vis[u]=1;q.push(u);while(!q.empty()){u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(!vis[v]){vis[v]=1;q.push(v);}}}}

例题:nyoj--最小步数(简单题,一种不需要变相思维的题,直接套用模板)

#include<stdio.h>#include<string.h>#include<queue>#include<iostream>using namespace std;#define INF 0xfffffffint x,y,ex,ey,ans,vis[11][11];int dx[4]={0,1,-1,0};int dy[4]={1,0,0,-1};int map[9][9]={ 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,};struct node{int x,y,step;}a,temp;int jud(struct node a){if(a.x<0||a.x>=9||a.y<0||a.y>=9||vis[a.x][a.y]||map[a.x][a.y])return 0;return 1;}void bfs(){a.x=x;a.y=y;a.step=0;memset(vis,0,sizeof(vis));queue<node>q;vis[x][y]=1;q.push(a);while(!q.empty()){a=q.front();q.pop();for(int i=0;i<4;i++){temp.x=a.x+dx[i];temp.y=a.y+dy[i];temp.step=a.step+1;if(jud(temp)){if(temp.x==ex&&temp.y==ey){ans=temp.step;return;}vis[temp.x][temp.y]=1;q.push(temp);}}}}int main(){int t;scanf("%d",&t);while(t--){int c=0;scanf("%d%d%d%d",&x,&y,&ex,&ey);if(x==ex&&y==ey){printf("0\n");continue;}ans=INF;bfs();printf("%d\n",ans);}}        


 

 

 

 

 

 

 

 

 

 

 


 

0 0