原题: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;
}
}