写的正解,不知为何第25个点MLE了
马蜂比较奇怪
#include <bits/stdc++.h>
using namespace std;
const int N=2010;
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
int n,m;
char s[N][N];
bool vis[N][N],flag;
int deg[N][N];
int tot;
queue<pair<int,int> > q;
void dfs1(int x,int y) {
tot++;
deg[x][y]=0;
vis[x][y]=1;
for(int i=0;i<4;i++) {
int vx=x+dx[i],vy=y+dy[i];
if(vx<1 || vx>n || vy<1 || vy>m) continue;
if(s[vx][vy]=='*') continue;
deg[x][y]++;
if(vis[vx][vy]) continue;
dfs1(vx,vy);
}
if(deg[x][y]==1) q.push({x,y});
}
void dfs2(int x,int y) {
flag&=s[x][y]!='.';
vis[x][y]=0;
for(int i=0;i<4;i++) {
int vx=x+dx[i],vy=y+dy[i];
if(vx<1 || vx>n || vy<1 || vy>m) continue;
if(s[vx][vy]=='*') continue;
if(!vis[vx][vy]) continue;
dfs2(vx,vy);
}
}
void dfs3(int x,int y) {
vis[x][y]=1;
for(int i=0;i<4;i++) {
int vx=x+dx[i],vy=y+dy[i];
if(vx<1 || vx>n || vy<1 || vy>m) continue;
if(s[vx][vy]=='*') continue;
if(vis[vx][vy]) continue;
dfs3(vx,vy);
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%s",s[i]+1);
}
flag=1;
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
if(s[i][j]=='*') continue;
if(vis[i][j]) continue;
while(!q.empty()) q.pop();
tot=0;
dfs1(i,j);
if(q.empty() || (tot&1)) {
flag=0;
break;
}
while(!q.empty()) {
int ux=q.front().first,uy=q.front().second;
q.pop();
int cnt=0;
for(int k=0;k<4;k++) {
int vx=ux+dx[k],vy=uy+dy[k];
if(vx<1 || vx>n || vy<1 || vy>m) continue;
if(s[vx][vy]!='.') continue;
cnt++;
deg[vx][vy]--;
if(deg[vx][vy]==1) q.push({vx,vy});
}
if(s[ux][uy]=='.' && cnt!=1) {
flag=0;
break;
}
else if(s[ux][uy]=='.') {
for(int k=0;k<4;k++) {
int vx=ux+dx[k],vy=uy+dy[k];
if(vx<1 || vx>n || vy<1 || vy>m) continue;
if(s[vx][vy]!='.') continue;
if(k==0) s[ux][uy]='<',s[vx][vy]='>';
else if(k==1) s[ux][uy]='>',s[vx][vy]='<';
else if(k==2) s[ux][uy]='^',s[vx][vy]='v';
else s[ux][uy]='v',s[vx][vy]='^';
if(deg[vx][vy]!=1) q.push({vx,vy});
}
}
}
dfs2(i,j);
dfs3(i,j);
if(!flag) break;
}
if(!flag) break;
}
if(!flag) printf("Not unique");
else {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
printf("%c",s[i][j]);
}
printf("\n");
}
}
return 0;
}