#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int dis[N][N],t,n,m,vis[N][N],pre[N][N];char ch[N][N];
int dr[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
char drr[4]={'U','D','R','L'};
struct node{
int a,b,dis;
bool operator<(const node&TP)const{
return dis>TP.dis;
}
};
void dij(int a,int b){
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) dis[i][j]=1e9,vis[i][j]=0;
priority_queue<node> q;
q.push({1,1,0});
dis[1][1]=0;
while(q.size()){
auto tp=q.top();q.pop();
if(vis[tp.a][tp.b]==1) continue;
vis[tp.a][tp.b]=1;
for(int i=0;i<4;i++){
int a=tp.a+dr[i][0],b=tp.b+dr[i][1],c=tp.dis;
if(a<1||a>n||b<1||b>m) continue;
int cost=(ch[tp.a][tp.b]==drr[i]?0:1);
if(dis[a][b]>dis[tp.a][tp.b]+cost){
dis[a][b]=dis[tp.a][tp.b]+cost;
pre[a][b]=i;
q.push({a,b,dis[a][b]});
}
}
}
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",ch[i]+1);
dij(1,1);
cout<<dis[n][m]<<endl;
int x=n,y=m;
while(x!=1||y!=1){
int tx=x-dr[pre[x][y]][0],ty=y-dr[pre[x][y]][1];
if(ch[tx][ty]!=drr[pre[x][y]]){
cout<<tx<<" "<<ty<<" "<<drr[pre[x][y]]<<endl;
}
x=tx;y=ty;
}
}
}
2022牛客寒假算法基础集训营6 迷宫2 最短路dij
最新推荐文章于 2023-01-30 21:20:15 发布