返回题解分享
讨论 / 题解分享/ 帖子详情

迷宫 - 题解

用bfs模拟,本题是朝一个方向一直走,所以需要维护一个路径,还需要维护一个停止的点,因为只需要将到停止的点加入到队列中

#include<cstdio>
#include<iostream>
#include<vector>
#include<map>
#include<cstring>
#include<array>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
using i64=long long;
//using i128=__int128;
const i64 INF=1e18;
const int mod=998244353;
//const int N=1e9+7;
void solve(){
    int n,m;
    cin>>n>>m;
    vector<vector<char> >g(n+1,vector<char>(m+1));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>g[i][j];
        }
    }
    vector<vector<int> >vis(n+1,vector<int>(m+1)),stop(n+1,vector<int>(m+1));
    queue<pair<int,int> >q;
    int ans=0;
    q.push({2,2});
    vis[2][2]=1;
    stop[2][2]=1;//记录停止点,将停止点加入到数组中
    int dx[]={0,0,1,-1};
    int dy[]={1,-1,0,0};
    ans++;
    while(!q.empty()){
        auto [x,y]=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            //由于是要往一个方向移动,所以需要用一个临时变量
            int nx=x,ny=y;
            vector<pair<int,int> >path;
            path.push_back({nx,ny});
            while(1){
                //一直往一个方向移动,直到撞到石头
                int _nx=dx[i]+nx,_ny=dy[i]+ny;
                if(_nx<1||_nx>n||_ny<1||_ny>m||g[_nx][_ny]=='#')break;
                //记录路径
                path.push_back({_nx,_ny});
                //更新nx,ny
                nx=_nx,ny=_ny;
            }
            for(auto [_x,_y]:path){
                if(!vis[_x][_y]){
                    vis[_x][_y]=1;
                    ans++;
                }
            }
            //将终点入队
            if(!stop[nx][ny]){
                stop[nx][ny]=1;
                q.push({nx,ny});
            }
        }
    }
    cout<<ans<<'\n';
}
int main(){
    int _=1;
    //cin>>_;
    while(_--)solve();
    return 0;
}
0 回复 0 转发 0 喜欢 2 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!