思路:能走一步是一步,从+开始搜
没过样例
#include<bits/stdc++.h>
using namespace std;
const int N=11;
const int vx[5]= {0,1,0,-1,0},vy[5]= {0,0,-1,0,1};
int n,m,ans,f[N][N],flag,k=1;
queue< pair<int,int> >q;
map<pair<int,int>,pair<int,int>>vis;
pair<int,int> find(pair<int,int>k){
int x=k.first,y=k.second;
if(vis[{x,y}].first==x && vis[{x,y}].second==y){
return {x,y};
}else return vis[{x,y}]=find(vis[{x,y}]);
}
void unin(pair<int,int>a,pair<int,int>b){
pair<int,int>fa=find(a);
pair<int,int>fb=find(b);
if(fa!=fb){
vis[fa]=fb;
return;
}
}
char ch;
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>ch;
vis[{i,j}]={i,j};
if(ch=='+') {
f[i][j]=2;
q.push(pair<int,int> {i,j});
} else if(ch=='#') {
f[i][j]=1;
} else {
f[i][j]=0;
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("{%2d,%2d} ",vis[{i,j}].first,vis[{i,j}].second);
}
puts("");
}
puts("");*/
while(!q.empty()) {
int x=q.front().first;
int y=q.front().second;
q.pop();
if(f[x][y]==1)continue;
map<pair<int,int>,int>ma;
pair<int,int>num;
int cnt=0,sum=0,last;
for(int i=1; i<=4; i++) {
int nx=x+vx[i],ny=y+vy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&f[nx][ny]==2){
cnt++;
last=f[nx][ny];
num={nx,ny};
if(ma[find(vis[{nx,ny}])]==0)ma[find(vis[{nx,ny}])]=1,sum++;
}
}
if(cnt<=sum) {
unin(num,{x,y});
f[x][y]=last;
ans++;
f[x][y]=2;
for(int i=1; i<=4; i++) {
int nx=x+vx[i],ny=y+vy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&f[nx][ny]==0)q.push(pair<int,int> {nx,ny});
if(ma[find(vis[{nx,ny}])]==1)ma[find(vis[{nx,ny}])]=0,unin({nx,ny},{x,y});
}
}
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("{%2d,%2d} ",vis[find({i,j})].first,vis[find({i,j})].second);
}
puts("");
}*/
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(f[i][j]==1)cout<<"#";
if(f[i][j]==2)cout<<"+";
if(f[i][j]==0)cout<<".";
}
puts("");
}
return 0;
}