1 条题解
-
0
#include<cstdio> #include<cstring> struct target { int x,y; }t[1000001]; struct queue { int x,y; }q[1000001]; const int mx[4]={0,1,0,-1}; const int my[4]={1,0,-1,0}; int n,m,cnt,x1,y1,x2,y2,head,tail,ans=100000000; int map[1001][1001]; int dis1[1001][1001]; int dis2[1001][1001]; bool mrk[1001][1001]; inline int min(int a,int b) {return a<b?a:b;} inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void bfs1(int x,int y) { head=0;tail=1;mrk[x][y]=1; q[1].x=x;q[1].y=y; while (head<tail) { int nx=q[++head].x,ny=q[head].y; for (int k=0;k<4;k++) { int xx=nx+mx[k],yy=ny+my[k]; if (xx<1||xx>n||yy<1||yy>m)continue; if (mrk[xx][yy]||map[xx][yy]==1) continue; dis1[xx][yy]=dis1[nx][ny]+1; q[++tail].x=xx;q[tail].y=yy; mrk[xx][yy]=1; } } } inline void bfs2(int x,int y) { memset(q,0,sizeof(q)); memset(mrk,0,sizeof(mrk)); head=0;tail=1;mrk[x][y]=1; q[1].x=x;q[1].y=y; while (head<tail) { int nx=q[++head].x,ny=q[head].y; for (int k=0;k<4;k++) { int xx=nx+mx[k],yy=ny+my[k]; if (xx<1||xx>n||yy<1||yy>m)continue; if (mrk[xx][yy]||map[xx][yy]==1) continue; dis2[xx][yy]=dis2[nx][ny]+1; q[++tail].x=xx;q[tail].y=yy; mrk[xx][yy]=1; } } } int main() { m=read();n=read(); for (int i=1;i<=n;i++) for(int j=1;j<=m;j++) { map[i][j]=read(); if (map[i][j]==4) { t[++cnt].x=i; t[cnt].y=j; }else if (map[i][j]==2) { x1=i; y1=j; map[i][j]=0; }else if (map[i][j]==3) { x2=i; y2=j; map[i][j]=0; } } bfs1(x1,y1); bfs2(x2,y2); for (int i=1;i<=cnt;i++) { int nx=t[i].x,ny=t[i].y; if (!(dis1[nx][ny]+dis2[nx][ny]))continue; ans=min(ans,dis1[nx][ny]+dis2[nx][ny]); } printf("%d",ans); return 0; }
- 1
信息
- ID
- 1671
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 4
- 上传者