4 条题解

  • 0
    @ 2025-3-29 13:16:05

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

    信息

    ID
    297
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    44
    已通过
    18
    上传者