bfs
bfs(宽度优先搜索)即从每个点出发,找到它之后的所有可行的点,加入队列中。
常见应用:
走迷宫问题
下一步状态可由上一步状态转移得到的问题
代码
#include<bits/c++.h> //bfs using namespace std; int w,h; char a[22][22]; int si,sj; bool vis[22][22]; int cnt=0; struct node{ int x,y; }; int change[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //便于改变坐标 bool check(int i,int j){ if(i<=h&&i>=1&&j<=w&&j>=1&&!vis[i][j]){ return 1; } return 0; } void bfs(int nowi,int nowj){ queue<node>q; node start,next; start.x=nowi; start.y=nowj; q.push(start); while(!q.empty()){ start=q.front(); //start是队首元素 q.pop(); //删除队首元素 for(int i=0;i<4;i++){ next.x=start.x+change[i][0]; next.y=start.y+change[i][1]; if(check(next.x,next.y)){ if(a[next.x][next.y]=='.'){ cnt++; vis[next.x][next.y]=1; q.push(next); } } } } } int main(){ while(cin>>w>>h&&!(w==0&&h==0)){ memset(vis,0,sizeof(vis)); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++){ cin>>a[i][j]; if(a[i][j]=='@'){ si=i,sj=j; cnt=1; vis[i][j]=1; } if(a[i][j]=='#'){ vis[i][j]=1; } } } bfs(si,sj); printf("%d\n",cnt); } return 0; }