Submit Time:2025-06-08 15:44:34

运行 ID: 37998

#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair using namespace std; const int N=1020; int a[N][N],b[N][N]; int n,p1,p2; int dx[]={1,0,0,-1},dy[]={0,1,-1,0}; stack<pii> st; bool vis[N][N]; bool tag[N][N]; priority_queue<pii> pq; bool ok=0; bool isd(int x,int y,int dir){ if(dir==0) return a[x+1][y]; if(dir==1) return b[x][y+1]; if(dir==2) return b[x][y]; if(dir==3) return a[x][y]; return 0; } void dfs1(int x,int y){ vis[x][y]=1; if(ok) return ; st.push(mk(x,y)); if(x==n&&y==p2) ok=1; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(vis[nx][ny]||nx<1||ny<1||nx>n||ny>n||isd(x,y,i)) continue; dfs1(nx,ny); }if(!ok) st.pop(); } int ans[N][N],cst[5]; void dfs2(int x,int y,int st,int mh,bool fl=0){ //if(!fl) cout<<x<<' '<<y<<' '<<st<<endl; ans[x][y]=st; if(x==n&&y==p2) return ; if(ans[x][y]!=2) pq.push(mk(x,y));//cout<<"pq "<<x<<' '<<y<<endl;//,vis[x][y]=1;//cout<<x<<' '<<y<<endl; if(st==0) return ; //st==0 bool flg=0; for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx<1||ny<1||nx>n||ny>n||isd(x,y,i)) continue; if(i==0&&tag[nx][ny]&&!ans[nx][ny]&&st!=2&&!fl) flg=1; //if(x==1&&y==4)cout<<"dfs "<<nx<<' '<<ny<<' '<<ans[nx][ny]<<' '<<flg<<endl; if(!tag[nx][ny]){ int nmh=mh; cst[i]=st; if(i==0) cst[i]=2; if(i==0&&st!=2) nmh=x+1; if(i==3&&st!=2) cst[i]=0; if(i==3&&nx<mh&&st==2) cst[i]=1; if(i!=0&&flg) cst[i]=0; if(ans[nx][ny]>=cst[i]) continue; //cout<<"dfs "<<nx<<' '<<ny<<' '<<cst[i]<<endl; dfs2(nx,ny,cst[i],nmh,fl); } } for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx<1||ny<1||nx>n||ny>n||isd(x,y,i)||fl) continue; if(tag[nx][ny]&&!ans[nx][ny]){ if(i==3){ //cout<<"upd "<<x<<' '<<y<<' '<<pq.size()<<endl; priority_queue<pii> pq2; while(!pq.empty()){ //cout<<"OK"<<endl; pii p=pq.top(); if(p.fi>=x){ ans[p.fi][p.se]=2; pq.pop(); //cout<<x<<' '<<y<<' '<<p.fi<<' '<<p.se<<endl; dfs2(p.fi,p.se,2,x,1); }else if(p.fi==x-1){ pq2.push(p);pq.pop(); }else{ break; } }//cout<<"??"<<endl; while(!pq2.empty()){ pii p=pq2.top();pq2.pop(); if(ans[p.fi][p.se]==2) continue; ans[p.fi][p.se]=1; //cout<<p.fi<<' '<<p.se<<endl; dfs2(p.fi,p.se,1,p.fi,1); } } dfs2(nx,ny,1,mh); } } } int main(){ cin>>n>>p1>>p2; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>b[i][j]; } }dfs1(1,p1); memset(vis,0,sizeof(vis)); while(!st.empty()){ pii p=st.top();st.pop(); tag[p.fi][p.se]=1; }dfs2(1,p1,1,1); for(int i=1;i<n;i++){ for(int j=1;j<=n;j++){ if(ans[i][j]==2) continue; if(isd(i,j,0)) continue; if(ans[i+1][j]==2) ans[i][j]=1; } }for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cout<<ans[i][j]<<' '; }cout<<endl; } return 0; }