D. Solve The Maze

原题链接

题解

考虑利用边界和墙来封锁坏人,封锁圈越大,好人的空间就越小。如果一个封锁圈是合理的,那么比他小的封锁圈也一定是合理的,无限小直到包裹坏人的四周

所以贪心地在坏人四周放墙,如果放的过周围有好人在周围,或者有好人但是把终点放了,或者从终点出发无法到达所有的好人(从多元深搜变成了单源广搜)

code

#include<bits/stdc++.h>
using namespace std;
int n,m;
char s[55][55];
int xx[4]={1,0,-1,0},yy[4]={0,-1,0,1};
struct node
{
    int x,y;
};

int check()
{
    int sum=0;

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(s[i][j]=='B')
            {
                for(int k=0;k<4;k++)
                {
                    int x1=i+xx[k],y1=j+yy[k];
                    if(x1>0&&x1<=n&&y1>0&&y1<=m)
                    {
                        if(s[x1][y1]=='G') return 0;
                        if(s[x1][y1]=='.') s[x1][y1]='#';
                    }
                }
            }
            if(s[i][j]=='G') sum++;
        }
    }

    if(sum&&s[n][m]=='#') return 0;
    int vis[55][55]={0};
    queue<node> q;
    q.push({n,m});
    vis[n][m]=1;
    while(q.size())
    {
        int x=q.front().x,y=q.front().y;
        q.pop();
        if(s[x][y]=='G') sum--;
        for(int i=0;i<4;i++)
        {
            int x1=x+xx[i],y1=y+yy[i];
            if(x1>0&&x1<=n&&y1>0&&y1<=m&&!vis[x1][y1]&&s[x1][y1]!='#')
            {
                q.push({x1,y1});
                vis[x1][y1]=1;
            }
        }
    }
    return !sum;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++) cin>>s[i][j];
        }

        if(check())puts("YES");
        else puts("NO");
    }
    return 0;
}
posted @   纯粹的  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示