0
点赞
收藏
分享

微信扫一扫

BFS: 01迷宫

夹胡碰 2022-04-16 阅读 144
c++bfs算法

题目描述

有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入

第1行为两个正整数n,m。 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

输出

m行,对于每个询问输出相应答案。

样例输入

2 2
01
10
1 1
2 2

样例输出

4
4

提示

n <= 400

分析

使用BFS,需要判断当前位置是0还是1,再根据这一点来对下一个点进行探索

#include <bits/stdc++.h>

using namespace std;


int main()
{
    int dx[4] = {-1,0,1,0};//横向移动
    int dy[4] = {0,-1,0,1};//纵向移动
    int n,m,ans;
    cin>>n>>m;
    vector<vector<char>> dis;//定义地图
    for(int i = 0;i<n;i++){
        vector<char> tmp;
        for(int j = 0;j<n;j++){
            char tp;
            cin>>tp;
            tmp.push_back(tp);
        }
        dis.push_back(tmp);
    }
    bool visited[n][n];
    queue<pair<int,int>> que;
    for(int i = 0;i<m;i++){
        memset(visited,false,sizeof(visited));
        int x,y;
        cin>>x>>y;
        ans = 1;
        que.push(make_pair(x-1,y-1));
        visited[x-1][y-1] = true;

        while(!que.empty()){
            int xx = que.front().first,yy = que.front().second;
            que.pop();
            char flag = dis[xx][yy];//引入flag,记录当前位置是0还是1
            for(int j = 0;j<4;j++){
                if(xx+dx[j]>=0&&
                   xx+dx[j]<n&&
                   yy+dy[j]>=0&&
                   yy+dy[j]<n&&
                   dis[xx+dx[j]][yy+dy[j]] != flag&&
                   visited[xx+dx[j]][yy+dy[j]] == false){
                    ans++;
                    visited[xx+dx[j]][yy+dy[j]] = true;
                    que.push(make_pair(xx+dx[j],yy+dy[j]));
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
举报

相关推荐

0 条评论