Educational Codeforces Round 118 E

E. Crazy Robot

题链
很轻松能发现是bfs
我们肯定是从L出发 然后看他们该点可以去的地方是不是只有一条 并且旁边挨着'+'
但是打完一交发现wa3
3 2
.#
..
L.
发现我们会先扩展L上面那个点
然后之后为了保证时间复杂度就不会再扩展了
但实际上 我们当且仅当一个点变成了‘+’之后
她旁边没有扩展过的点才有可能变成‘+’ 因为我们的必要条件就是旁边必须挨着‘+’才行
这样我们每次变成+才会放进去4个 保证了时间复杂度 并且不会发现上面那种情况了

void solve(){
    int n,m;cin>>n>>m;
    char a[n+1][m+1];
    int x,y=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]=='L'){
                x=i,y=j;
            }
        }
    }
    queue<pair<int,int>>q;
    int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
    for(int i=0;i<4;i++){
        int nx=dx[i]+x,ny=dy[i]+y;
        if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
            q.push({nx,ny});
        }
    }
    while(q.size()){
        auto [x,y]=q.front();
        q.pop();
        if(a[x][y]=='#'||a[x][y]=='L')continue;
        int t=0,flag=0;
        for(int i=0;i<4;i++){
            int nx=dx[i]+x,ny=dy[i]+y;
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
                if(a[nx][ny]!='#'){
                    t++;
                }
                if(a[nx][ny]=='L'){
                    flag++;
                }
            }
        }
        if(t-flag<=1&&flag){
            a[x][y]='L';
            for(int i=0;i<4;i++){
                int nx=dx[i]+x,ny=dy[i]+y;
                if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
                    q.push({nx,ny});
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i==x&&j==y)cout<<'L';
            else{
                if(a[i][j]=='L')cout<<"+";
                else cout<<a[i][j];
            }
        }
        cout<<endl;
    }
    cout<<endl;
}
posted @ 2023-01-03 01:25  ycllz  阅读(19)  评论(0)    收藏  举报