01 bfs,但是 WA 了最后一个点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#include<deque>
#define siz(x) int((x).size())
#define cauto const auto
#define all(x) (x).begin(),(x).end()
using std::cin;using std::cout;
using loli=long long;
using venti=__int128_t;
using pii=std::pair<int,int>;
constexpr int kN=2001,dx[]={-1,1,0,0},dy[]={0,0,-1,1};
const std::string dc="^v<>";
char c[kN][kN];
int n,m,dis[kN][kN];
pii pre[kN][kN];
std::deque<pii>q;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
std::ios::sync_with_stdio(false);cin.tie(nullptr);
cin>>n>>m;
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]=='o'){
dis[i][j]=0;
q.emplace_back(i,j);
}
}
while(!q.empty()){
auto[x,y]=q.front();q.pop_front();
// cout<<x<<' '<<y<<'\n';
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||ny<1||nx>n||ny>m)continue;
// cout<<"try "<<nx<<' '<<ny<<'\n';
int w=(c[x][y]!=dc[i]&&dc.find(c[i])!=dc.npos&&c[x][y]!='o');
if(dis[nx][ny]>dis[x][y]+w){
dis[nx][ny]=dis[x][y]+w;
pre[nx][ny]={x,y};
if(c[nx][ny]=='x'){
cout<<dis[nx][ny]<<'\n';
for(;pre[nx][ny]!=pii(0,0);){
auto[px,py]=pre[nx][ny];
if(px-1==nx&&(dc.find(c[px][py])!=dc.npos||c[px][py]=='.'))c[px][py]='^';
if(px+1==nx&&(dc.find(c[px][py])!=dc.npos||c[px][py]=='.'))c[px][py]='v';
if(py-1==ny&&(dc.find(c[px][py])!=dc.npos||c[px][py]=='.'))c[px][py]='<';
if(py+1==ny&&(dc.find(c[px][py])!=dc.npos||c[px][py]=='.'))c[px][py]='>';
nx=px,ny=py;
}
goto print;
}
if(w)q.emplace_back(nx,ny);
else q.emplace_front(nx,ny);
}
}
}
print:
for(int i=1;i<=n;i++,cout<<'\n')for(int j=1;j<=m;j++)cout<<c[i][j];
// for(int i=1;i<=n;i++,cout<<'\n')for(int j=1;j<=m;j++)cout<<dis[i][j]<<' ';
// for(int i=1;i<=n;i++,cout<<'\n')for(int j=1;j<=m;j++)cout<<'('<<pre[i][j].first<<','<<pre[i][j].second<<')'<<' ';
return 0;
}