提交时间:2025-06-08 15:27:31

运行 ID: 37992

#include<bits/stdc++.h> using namespace std; const int N=1010; int mp[N][N][4]; int ax[N*N],ay[N*N]; int vis[N][N],d[N][N],ans[N][N]; int dx[4]={-1,1,0,0}; int dy[4]={0,0,-1,1}; int n,X,Y,tot; int dfs(int x,int y) { tot++; ax[tot]=x,ay[tot]=y; vis[x][y]=1; if(x==n&&y==Y) return 1; for(int i=0;i<=3;i++) { int tx=x+dx[i],ty=y+dy[i]; if(mp[x][y][i]&&!vis[tx][ty]) if(dfs(tx,ty)) return 1; } tot--; vis[x][y]=0; return 0; } void dfs1(int x,int y,int xu,int flow) { for(int i=0;i<=3;i++) { int tx=x+dx[i],ty=y+dy[i]; if(mp[x][y][i]&&!vis[tx][ty]) { if(x<flow) continue; vis[tx][ty]=1; ans[tx][ty]=1; if(tx>=xu) ans[tx][ty]=2; dfs1(tx,ty,xu,flow); } } } int main() { cin>>n>>X>>Y; for(int i=1;i<=n;i++) { for(int j=1,x;j<=n;j++) { cin>>x; if(!x) mp[i][j][0]=mp[i-1][j][1]=1; } } for(int i=1;i<=n;i++) { for(int j=1,x;j<=n;j++) { cin>>x; if(!x) mp[i][j][2]=mp[i][j-1][3]=1; } } dfs(1,X); int minflow=1010,minxu=1010; for(int i=tot;i>=1;i--) { int x=ax[i],y=ay[i]; minflow=min(minflow,x); if(i==tot) d[x][y]=x; else d[x][y]=min(x,d[ax[i+1]][ay[i+1]]); ans[x][y]=1; if(i!=tot&&d[x][y]<x) ans[x][y]=2; if(ans[x][y]==2) minxu=min(minxu,x); if(i==tot) continue; if(ax[i+1]==x+1&&ans[x+1][y]!=2) continue; dfs1(x,y,min(x+1,minxu),minflow); } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) cout<<ans[i][j]<<" "; cout<<'\n'; } }