1 条题解
-
0
写代码不易,点个赞吧!
切勿抄袭。
#include "bits/stdc++.h" #define int long long using namespace std; const int N=1010; struct stu{ int x,y,qdr,bs; /* 0:上 1:下 2:左 3:右 4:无 */ bool tx,qp; }; int n,m,a[N][N]; bool vs[N][N][2][4]; //行、列、通行证、方向4状态 int dir[10][1]={{-1,0},{1,0},{0,-1},{0,1}}; bool check(int x,int y,bool tx){ if(x<1||x>n||y<1||y>m||a[x][y]==0){ //超出地图边界或封闭区 return 0; } if(a[x][y]==3&&!tx){ //管控区但没有通行证 return 0; } return 1; } queue<stu>q; signed main(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%lld",&a[i][j]); } } q.push({1,1,4,0,0,0}); while(!q.empty()){ stu t=q.front(); q.pop(); int s=t.bs+1; if(t.x==n&&t.y==m){ //到达终点 printf("%lld",t.bs); return 0; } if(t.qp){ //快速通道 t.tx=0; int nx=t.x,ny=t.y; nx+=dir[t.qdr][0]; ny+=dir[t.qdr][1]; if(a[nx][ny]==4){ //还是快速通道 q.push({nx,ny,t.qdr,s,0,1}); vs[nx][ny][0][t.qdr]=1; continue; } else if(check(nx,ny,0)){ //非快速但可走 q.push({nx,ny,4,s,0,0}); if(a[t.x][t.y]==2){ //补给点 t.tx=1; } vs[nx][ny][t.tx][t.qdr]=1; continue; } } if(a[t.x][t.y]==2){ //补给点 t.tx=1; } for(int i=0;i<4;i++){ //正常行走 int nx=t.x,ny=t.y; nx+=dir[i][0],ny+=dir[i][1]; if(a[nx][ny]==4&&!vs[nx][ny][t.tx][i]){ //是快速通道 vs[nx][ny][t.tx][i]=1; q.push({nx,ny,i,s,0,1}); } else if(check(nx,ny,t.tx)&&!vs[nx][ny][t.tx][i]){ //不是快速通道且可走 vs[nx][ny][t.tx][i]=1; q.push({nx,ny,4,s,t.tx,0}); } } } printf("-1"); return 0; }
- 1
信息
- ID
- 6062
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 23
- 已通过
- 2
- 上传者