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;
}

 

posted @ 2021-03-28 13:24  starlightlmy  阅读(417)  评论(0)    收藏  举报