Robots at Warehouse (机器人换位置,简单图论题)

原题:Gym-100971J

题意:

n*m地图,每次只能走上下左右四个方向中的一个,走一格,#不能走,有A,B两个机器人,在同一时间不能落在一个格子里,且不能对换位置,问是否可以交换位置

解析:

首先,需要A和B连通

然后,你可能走到一个可以走三个方向的格子,你就可以让一个机器人躲进去,从而交换位置

如果没有这种情况,还有一种可行的办法是AB间存在一个环

代码:


string M[200000],vis[200000];

int n,m;
struct node{
    int x,y;
    node(){}
    node(int x,int y):x(x),y(y){}
};
int d[4][2]={{1,0},{0,-1},{0,1},{-1,0}};

int yes=0;
int f=0;

int ch(node p){int s=0;
    for(int i=0;i<4;i++){
        int x=p.x+d[i][0],y=p.y+d[i][1];
        if(x<0||x>=n||y<0||y>=m||M[x][y]=='#')continue;
        s++;
    }
    if(s==1)f=1;
    if(s>2)return 1;
    return 0;
}

void bfs(node p){
    if(ch(p))yes=1;
    queue<node>q;
    vis[p.x][p.y]='y';q.push(p);
    while(!q.empty()){
        node t=q.front();q.pop();
        for(int i=0;i<4;i++){
            int x=t.x+d[i][0],y=t.y+d[i][1];
            if(x<0||x>=n||y<0||y>=m||vis[x][y]=='y'||M[x][y]=='#')continue;
            vis[x][y]='y';q.push(node(x,y));if(ch(node(x,y)))yes=1;
        }
    }
}



main(){
    n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)cin>>M[i],vis[i]=M[i];
    node st,en;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(M[i][j]=='1'){st.x=i,st.y=j;}
            if(M[i][j]=='2'){en.x=i,en.y=j;}
        }
    }
    bfs(st);
    if(vis[en.x][en.y]!='y')printf("NO\n");
    else if(yes)printf("YES\n");
    else{
        if(f)printf("NO\n");
        else printf("YES\n");
    }

}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81316843