Treasure Island(简单图论题)

原题:Gym-100971A

题意:

n*m图,‘.’代表陆地,‘#’代表海,‘?’未知,问你是否有确定的一片大陆(没有其他点)

解析:

开始的时候没看到条件(一定有一个‘.’)多写了一大堆判断条件

既然一定有一个点,那么我们就先找到这个点,把?看成陆地走一遍,然后,这遍假设没走到一个‘.’,那么就是不可能了,对于‘?’,如果没走过的就是#了,走过的判一下去掉这个点后是不是对陆地有影响,没影响的话说明是边上的两个都可以是的点,在没有不可能的情况下就是Ambiguous了。

代码:


string M[51];
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 vis[51][51],vis2[51][51];

int bfs1(node p){
    int sum=1;
    queue<node>q;
    vis[p.x][p.y]=1;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]||M[x][y]=='#')continue;
            vis[x][y]=1;q.push(node(x,y));sum++;
        }
    }
    return sum;
}

int bfs2(node p){
    int sum=1;
    queue<node>q;
    vis2[p.x][p.y]=1;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||vis2[x][y]||M[x][y]=='#')continue;
            vis2[x][y]=1;q.push(node(x,y));sum++;
        }
    }
    return sum;
}

main(){
    n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)cin>>M[i];
    node st;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(M[i][j]=='.'){st.x=i,st.y=j;break;}
        }
    }
    int am=0;
    mmm(vis,0);
    int sum =bfs1(st);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(M[i][j]=='#')continue;
            if(M[i][j]=='.'&&vis[i][j]==0)return 0*printf("Impossible\n");
            if(M[i][j]=='?'){
                if(vis[i][j]==0){M[i][j]='#';continue;}
                if(am)continue;
                M[i][j]='#';
                mmm(vis2,0);
                if(bfs2(st)==sum-1)am=1;
                else M[i][j]='.';
            }
        }
    }
    if(am)printf("Ambiguous\n");
    else{
        for(int i=0;i<n;i++)cout<<M[i]<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81301798
今日推荐