求 Hack
查看原帖
求 Hack
583186
2c_s楼主2024/3/9 18:29

思路:广搜找最短路,然后深搜找路径

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define pii pair<int,int>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define fi first
#define se second
#define rep(k,l,r) for(int (k)=(l);k<=(r);++k)
using namespace std;
inline ll read(){
	ll k=0,flag=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')flag=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		k=(k<<1)+(k<<3)+(c^48);
		c=getchar();
	}
	return k*flag;
}
void print(ll x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x>9)print(x/10);
    putchar(x%10+'0');
	return ;
}
const int N=2e3+10;
int n,m,ans,fa[N][N][2];
bool a[N][N],flag;
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
bool vis[N][N];
struct node{
	int x,y,step;
	bool op;
};queue<node>q;
void dfs(int x,int y,int dep,bool op,int xx,int yy){
	if(flag||dep>ans||x<1||x>n||y<1||y>m||vis[x][y]||!op^a[x][y])return ;
	vis[x][y]=1;
	fa[x][y][0]=xx;
	fa[x][y][1]=yy;
	if(x==n&&y==m){
		int nx=x,ny=y;
		string s="";
		while(fa[nx][ny][0]){
			if(fa[nx][ny][0]==nx-1)s+='D';
			else if(fa[nx][ny][0]==nx+1)s+='U';
			else if(fa[nx][ny][1]==ny-1)s+='R';
			else s+='L';
			int nxx=nx,nyy=ny;
			nx=fa[nxx][nyy][0];
			ny=fa[nxx][nyy][1];
		}
		reverse(s.begin(),s.end());
		cout<<s<<"\n";
		flag=1;
		return ;
	}
	rep(i,0,3)dfs(x+dx[i],y+dy[i],dep+1,a[x][y],x,y);
	return ;
}
void solve(){
	n=read(),m=read();
	rep(i,1,n){
		rep(j,1,m){
			char c;
			cin>>c;
			a[i][j]=c-'0';
			vis[i][j]=0;
		}
	}
	bool ok=0;
	vis[1][1]=1;
	q.push({1,1,0,a[1][1]});
	while(q.size()){
		node now=q.front();
		q.pop();
		if(now.x==n&&now.y==m){
			ans=now.step;
			ok=1;
			while(q.size())q.pop();
			break;
		}
		rep(i,0,3){
			int xx=now.x+dx[i];
			int yy=now.y+dy[i];
			if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||!now.op^a[xx][yy])continue;
			vis[xx][yy]=1;
			q.push({xx,yy,now.step+1,a[xx][yy]});
		}
	}
	if(!ok){
		puts("-1");
		return ;
	}
	print(ans);
	puts("");
	rep(i,1,n)rep(j,1,m)vis[i][j]=0;
	flag=0;
	dfs(1,1,0,!a[1][1],0,0);
	rep(i,1,n)rep(j,1,m)vis[i][j]=fa[i][j][0]=fa[i][j][1]=0;
	return ;
}
int main(){
	int T=read();
	while(T--)solve();
	return 0;
}
2024/3/9 18:29
加载中...