提交时间:2025-06-08 15:39:06
运行 ID: 37993
#include<bits/stdc++.h> #define int long long #define read2(a,b) read(a),read(b) #define read3(a,b,c) read2(a,b),read(c) #define read4(a,b,c,d) read3(a,b,c),read(d) #define read5(a,b,c,d,e) read4(a,b,c,d),read(e) #define read6(a,b,c,d,e,f) read5(a,b,c,d,e),read(f) using namespace std; template<typename T> void read(T &x){ x=0; bool neg=0; char c=getchar(); while(!isdigit(c)){if(c=='-')neg=1;c=getchar();} while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); if(neg)x=-x; } int n,x,y,w[1005][1005][4];//UDLR int ans[1005][1005]; int dp[1005][1005]; bool vis[1005][1005]; bool path[1005][1005]; bool dfs(int a,int b){ vis[a][b]=1; if(a==n&&b==y){ ans[a][b]=1; path[a][b]=1; dp[a][b]=a; return 1; } if(!w[a][b][0]&&!vis[a-1][b]){ if(dfs(a-1,b)){ ans[a][b]=1; path[a][b]=1; dp[a][b]=min(dp[a-1][b],a); return 1; } } if(!w[a][b][1]&&!vis[a+1][b]){ if(dfs(a+1,b)){ ans[a][b]=1; path[a][b]=1; dp[a][b]=min(dp[a+1][b],a); return 1; } } if(!w[a][b][2]&&!vis[a][b-1]){ if(dfs(a,b-1)){ ans[a][b]=1; path[a][b]=1; dp[a][b]=min(dp[a][b-1],a); return 1; } } if(!w[a][b][3]&&!vis[a][b+1]){ if(dfs(a,b+1)){ ans[a][b]=1; path[a][b]=1; dp[a][b]=min(dp[a][b+1],a); return 1; } } return 0; } void fill(int a,int b,int mn){ if(vis[a][b])return; if(path[a][b]&&dp[a][b]==a)return; vis[a][b]=1; if(a==mn)ans[a][b]=1; else ans[a][b]=2; if(a!=mn&&!w[a][b][0])fill(a-1,b,mn); if(!w[a][b][1])fill(a+1,b,mn); if(!w[a][b][2])fill(a,b-1,mn); if(!w[a][b][3])fill(a,b+1,mn); } void slv(){ read3(n,x,y); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int a;read(a); w[i][j][0]=w[i-1][j][1]=a; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int a;read(a); w[i][j][2]=w[i][j-1][3]=a; } } w[1][x][0]=1; for(int i=1;i<=n;i++)w[i][n][3]=1; for(int i=1;i<=n;i++)w[n][i][1]=1; dfs(1,x); memset(vis,0,sizeof vis); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(!path[i][j])continue; if(dp[i][j]<i)fill(i,j,dp[i][j]); if(!w[i][j][1]&&!path[i+1][j])fill(i+1,j,i); if(!w[i][j][2]&&((w[i][j][1]&&(i!=n||j!=y))||ans[i+1][j]==2)&&!path[i][j-1])fill(i,j-1,i); if(!w[i][j][3]&&((w[i][j][1]&&(i!=n||j!=y))||ans[i+1][j]==2)&&!path[i][j+1])fill(i,j+1,i); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)cout<<ans[i][j]<<" "; cout<<endl; } } signed main(){ slv(); }