Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
38011 | 22级廖思学 | 【S】T2 | C++ | 通过 | 100 | 298 MS | 63292 KB | 2698 | 2025-06-08 16:44:59 |
#include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fr first #define sc second const int N=1e3+10; //dep[x][y]:这点及以后的最高的有水位置;tp[x][y]:这点及之后的最高的蓄水位置 int n,X,Y,ans[N][N],dep[N][N],tp[N][N],a[N][N][4],cnt; int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; bool vis[N][N]; pii st[N*N]; bool dfs(int x,int y){//找路径 // cout<<x<<" "<<y<<endl; if(x==n&&y==Y){st[++cnt]={x,y};return 1;} if(vis[x][y])return 0;vis[x][y]=1; for(int i=0;i<=3;i++){ int nx=x+dx[i],ny=y+dy[i]; if(!a[x][y][i]){ if(dfs(nx,ny)){st[++cnt]={x,y};return 1;} } } } //xu:蓄水高度上限;lim:流水高度上限 void dfs(int x,int y,int xu,int lim){ if(vis[x][y]==1)return;vis[x][y]=1; for(int i=0;i<=3;i++){ int nx=x+dx[i],ny=y+dy[i]; // cout<<nx<<" "<<ny<<" "<<a[x][y][i]<<" "<<lim<<endl; if(a[x][y][i]||nx<lim)continue; ans[nx][ny]=1;//cout<<"???"<<nx<<" "<<ny<<endl; if(nx>=xu){ans[nx][ny]=2;} dfs(nx,ny,xu,lim); } } void work(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)vis[i][j]=0; } int mx=1005,mxu=1005;//mx:路径上经过的最高高度;mxu:蓄水的最高高度 for(int i=1;i<=cnt;i++){ int x=st[i].fr,y=st[i].sc; dep[x][y]=mx=min(mx,x); ans[x][y]=1; //如果后面有水位抬升,那么此处会蓄水 if(mx<x){ans[x][y]=2;mxu=min(mxu,x);} //如果从这里到下一处是向下流,且下一处没蓄水,那么不可以向左右流 if(i==1||st[i-1].fr==x+1&&ans[x][y]!=2){vis[x][y]=1;continue;} // cout<<"!"<<x<<" "<<y<<" "<<min(mxu,x+1)<<" "<<mx<<endl; dfs(x,y,min(mxu,x+1),mx); } } signed main(){ scanf("%lld%lld%lld",&n,&X,&Y); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%lld",&a[i][j][0]);a[i-1][j][1]=a[i][j][0]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%lld",&a[i][j][2]);a[i][j-1][3]=a[i][j][2]; } } a[1][X][0]=1; for(int i=1;i<=n;i++)a[n][i][1]=1; for(int i=1;i<=n;i++)a[i][n][3]=1; // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++)cout<<i<<"-"<<j<<" "<<a[i][j][0]<<" "<<a[i][j][1]<<" "<<a[i][j][2]<<" "<<a[i][j][3]<<endl; // } dfs(1,X);//for(int i=1;i<=cnt;i++)cout<<st[i].fr<<" "<<st[i].sc<<endl; work(); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)printf("%lld ",ans[i][j]); printf("\n"); } fclose(stdin);fclose(stdout); return 0; }