求助#16 TLE -悬关
查看原帖
求助#16 TLE -悬关
961351
nightwatch.ryan楼主2024/3/9 21:09
#include<iostream>
#include<climits>
#include<queue>
#include<cstring>
#include<cstdio>
#include<map>
#define N 2005
int mp[N][N];
const int dx[4]={-1,1,0,0};
const int dy[4]={0,0,-1,1};
void bfs(int n,int m){
	int dist[n+1][m+1];
	bool vis[n+1][m+1]; 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dist[i][j]=INT_MAX,vis[i][j]=0;
	dist[1][1]=0;
	int pa[n+1][m+1]={0},pb[n+1][m+1]={0};
	std::queue<std::pair<int,int>>q;
	q.push({1,1});
	while(q.size()){
		std::pair<int,int>u=q.front();q.pop();
		vis[u.first][u.second]=1;
		for(int i=0;i<4;i++){
			int nextX=u.first+dx[i];
			int nextY=u.second+dy[i];
			if(nextX>=1 and nextX<=n and nextY>=1 and nextY<=m and mp[nextX][nextY]!=mp[u.first][u.second] and !vis[nextX][nextY]){
				int temp=dist[u.first][u.second]+1; 
				vis[nextX][nextY]=1;
				dist[nextX][nextY]=temp;
				pa[nextX][nextY]=u.first;
				pb[nextX][nextY]=u.second;
				q.push({nextX,nextY}); 
				vis[nextX][nextY]=0;
			}
		}
	}
	if(dist[n][m]==INT_MAX){
		std::cout<<"-1\n";
		return;
	}
	std::cout<<dist[n][m]<<'\n'; 
	int curX=n,curY=m; 
	std::string r;
	while(curX!=1 or curY!=1){
		int lastX=pa[curX][curY];
		int lastY=pb[curX][curY];
		if(lastX<curX)r="D"+r;
		else if(lastX>curX)r="U"+r;
		else if(lastY<curY)r="R"+r;
		else r="L"+r;
		curX=lastX;curY=lastY;
	}
	std::cout<<r<<'\n';
}
int main(){
	//std::ios::sync_with_stdio(0);
	int t;std::cin>>t;
	while(t--){
		int n,m;std::cin>>n>>m;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%1d",&mp[i][j]);
		bfs(n,m);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				mp[i][j]=0; 
			}
		} 
	}
}

验证码7kkk祭

2024/3/9 21:09
加载中...