1 条题解

  • 0
    @ 2023-8-30 21:38:43
    #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
    上传者