求助
查看原帖
求助
495601
Cang_shu楼主2024/3/23 11:50

MMM_JiaoFu悬关

#include<bits/stdc++.h>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

const int maxn=4000010;

char b[2005][2003];
int up[4000005];
int n,m;
vector<pair<int,int> > g[maxn];
void add_edge(int s,int e,int d) 
{
	g[s].push_back(make_pair(e,d));
}
int dist[maxn];
bool done[maxn];
void dijkstra(int ss)
{
	memset(dist,0x3f,sizeof(dist));
	memset(done,0,sizeof(done));
	dist[ss] = 0;
	priority_queue<pair<int,int> > heap;
	heap.push(make_pair(0,ss));
	for (;heap.size();)
	{
		while (done[heap.top().second])
			heap.pop();
		int p = heap.top().second;
		heap.pop();
		done[p] = true;
		for (int j=0;j<g[p].size();j++)
		{
			int q=g[p][j].first;
			int d=g[p][j].second;
			if (dist[q] > dist[p] + d)
			{
				dist[q] = dist[p] + d;
				up[q]=p;
				heap.push(make_pair(-dist[q],q));
			}
		} 
	}
}
void dfs(int x){
	if(x==1) return;
	dfs(up[x]);
	//x=(i-1)*m+j
	//printf("%lld\n",x);
	int tt=x%m;
	if(tt==0) tt=m;
	//x=x-tt  /m +1
	int ttt=(x-tt)/m+1;
	int bb=up[x]%m;
	if(bb==0) bb=m;
	int bbb=(up[x]-bb)/m+1;
	if(bb>tt) printf("U");
	else if(bb<tt) printf("D");
	if(bbb>ttt) printf("L");
	else if(bbb<ttt) printf("R");
}
int main()
{
	int t;
	cin>>t;
	while(t--){
		scanf("%d%d",&n,&m);int d;int ss;
//		for (int i=1;i<=n;i++){
//			for (int j=1;j<=m;j++){
//				b[i][j]=0;
//			}
//		}
		for (int i=1;i<=n;i++){
			for (int j=1;j<=m;j++){
				b[i][j]=' ';
				for(;b[i][j]!='0' && b[i][j]!='1';)
				scanf("%d",&b[i][j]);
			}
		}
		for (int i=1;i<=n;i++){
			for (int j=1;j<=m;j++){
				if(b[i][j]!=b[i-1][j]&&b[i-1][j]>40&&i-1>=1&&i-1<=n&&j>=1&&j<=m){
					add_edge((i-1)*m+j,(i-2)*m+j,1);
				}
				if(b[i][j]!=b[i+1][j]&&b[i+1][j]>40&&i+1>=1&&i+1<=n&&j>=1&&j<=m){
					add_edge((i-1)*m+j,(i)*m+j,1);
				}	
				if(b[i][j]!=b[i][j-1]&&b[i][j-1]>40&&i>=1&&i<=n&&j-1>=1&&j-1<=m){
					add_edge((i-1)*m+j,(i-1)*m+j-1,1);
				}
				if(b[i][j]!=b[i][j+1]&&b[i][j+1]>40&&i>=1&&i<=n&&j+1>=1&&j+1<=m){
					add_edge((i-1)*m+j,(i-1)*m+j+1,1);
				}	
			}
		}
		dijkstra(1);
		for (int i=1;i<=n*m;i++){
			g[i].clear();
		}
		if(done[n*m]==false){
			printf("-1\n");
			continue;
		}
		printf("%d\n",dist[n*m]);
		dfs(n*m);
		printf("\n");
		
	}
	return 0;
}
2024/3/23 11:50
加载中...