10pts求调

P2199 最后的迷宫

改了一下 60pts ```cpp #include <bits/stdc++.h> using namespace std; const int N=5005; int g[N][N]; bool vis[N][N]; char s[N][N]; int n,m; int b1,b2; struct Node{ int step; int px,py; }; inline void out(){ for (int i=1;i<=n;i++,puts("")) for (int j=1;j<=m;++j) printf("%d ",g[i][j]); } Node q[N]; const int dx[]={0,0,1,-1}; const int dy[]={1,-1,0,0};int tail,head; inline int bfs(int x,int y){ vis[x][y]=1; head=1,tail=0; q[++tail].px=x,q[tail].py=y; q[tail].step=0; while (head<=tail){ int x=q[head].px,y=q[head].py,now=q[head].step; head++; for (int i=0;i<4;i++){ int nx,ny; nx=x+dx[i]; ny=y+dy[i]; if (g[nx][ny]==2) return now+1; if (g[nx][ny]!=1&&nx>0&&ny>0&&nx<=n&&ny<=m&&!vis[nx][ny]){ vis[nx][ny]=1; q[++tail].px=nx,q[tail].py=ny,q[tail].step=now+1; } } } return -1; } int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++){ cin>>s[i]+1; for (int j=1;j<=m;j++) g[i][j]=(s[i][j]=='X'?1:0); } int p,o; cin>>p>>o>>b1>>b2; while (p!=0&&o!=0&&b1!=0&&b2!=0){ memset(vis,0,sizeof vis); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) g[i][j]=(s[i][j]=='X'?1:0); for (int i=p;i<=n;i++) if (g[i][o]!=1) g[i][o]=2; else break; for (int i=p;i>=1;i--) if (g[i][o]!=1) g[i][o]=2; else break; for (int j=o;j<=m;j++) if (g[p][j]!=1) g[p][j]=2; else break; for (int j=o;j>=1;j--) if (g[p][j]!=1) g[p][j]=2; else break; for (int i=p,j=o;i<=n&&j<=m;j++,i++) if (g[i][j]!=1) g[i][j]=2; else break; for (int i=p,j=o;i>=1&&j>=1;--j,i--) if (g[i][j]!=1) g[i][j]=2; else break; for (int i=p,j=o;i<=n&&j>=1;j--,i++) if (g[i][j]!=1) g[i][j]=2; else break; for (int i=p,j=o;i>=1&&j<=m;j++,i--) if (g[i][j]!=1) g[i][j]=2; else break; // out(); int ans=bfs(b1,b2); // for (int p=1;p<=tail;p++) // printf("%d %d %d\n",q[p].px,q[p].py,q[p].step); if (ans==-1){ puts("Poor Harry"); cin>>p>>o>>b1>>b2; continue; } cout<<ans<<endl; cin>>p>>o>>b1>>b2; } } /* 3 4 OOOO XXXO OOOO 3 3 1 1 0 0 0 0 */ ```
by QZY2008 @ 2022-09-22 01:09:09


|