1 条题解

  • 0
    @ 2025-4-12 21:41:03

    C++ :

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    using namespace std;
    int n,m,mark;
    const int inf=100000000;
    char a[101][101];
    int b[5][5],flag[101][101];
    int dre[4][2]={1,0,0,1,-1,0,0,-1};
    struct node
    {
    	int x,y,t;
    }p;
    int bfs(int sx,int sy,int dx,int dy)
    {
    	queue<node> q;
    	int x,y,t,u,v,i;
    	memset(flag,0,sizeof(flag));
    	p.x=sx;
    	p.y=sy;
    	p.t=0;
    	flag[sx][sy]=1;
    	q.push(p);
    	while(!q.empty())
    	{
    		p=q.front();
    		q.pop();
    		x=p.x;
    		y=p.y;
    		t=p.t;
    		if(x==dx&&y==dy)
    			return t;
    		for(i=0;i<4;i++)
    		{
    			u=x+dre[i][0];
    			v=y+dre[i][1];
    			if(u>=0&&u<n&&v>=0&&v<m&&a[u][v]!='*'&&flag[u][v]==0)
    			{
    				flag[u][v]=1;
    				p.x=u;
    				p.y=v;
    				p.t=t+1;
    				q.push(p);
    			}
    		}
    	}
    	mark=1;
    	return -1;
    }
    int main()
    {
    	int i,j,k,T,min;
    	int x[5],y[5],s[6];
    	scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%d%d%*c",&n,&m);
    		for(i=0;i<n;i++)
    		{
    			scanf("%s",a[i]);
    			for(j=0;j<m;j++)
    				if(a[i][j]=='S')
    				{
    					x[0]=i;
    					y[0]=j;
    				}
    				else if(a[i][j]=='A')
    				{
    					x[1]=i;
    					y[1]=j;
    				}
    				else if(a[i][j]=='B')
    				{
    					x[2]=i;
    					y[2]=j;
    				}
    				else if(a[i][j]=='C')
    				{
    					x[3]=i;
    					y[3]=j;
    				}
    				else if(a[i][j]=='D')
    				{
    					x[4]=i;
    					y[4]=j;
    				}
    		}
    		mark=0;
    		for(i=0;i<5;i++)
    		{
    			for(j=0;j<=i;j++)
    			{
    				if(j==0&&i==4)
    				{
    					b[i][j]=b[j][i]=inf;
    					continue;
    				}
    				else if(i==j)
    				{
    					b[i][j]=0;
    					continue;
    				}
    				b[i][j]=b[j][i]=bfs(x[i],y[i],x[j],y[j]);
    				if(mark)
    					break;
    			}
    			if(mark)
    				break;
    		}
    		if(mark)
    		{
    			printf("-1\n");
    			continue;
    		}
    		min=inf;
    		s[0]=b[0][1]+b[1][2]+b[2][3]+b[3][4];
    		s[1]=b[0][1]+b[1][3]+b[3][2]+b[2][4];
    		s[2]=b[0][2]+b[2][1]+b[1][3]+b[3][4];
    		s[3]=b[0][2]+b[2][3]+b[3][1]+b[1][4];
    		s[4]=b[0][3]+b[3][1]+b[1][2]+b[2][4];
    		s[5]=b[0][3]+b[3][2]+b[2][1]+b[1][4];
    		for(i=0;i<6;i++)
    			if(s[i]<min)
    				min=s[i];
    		printf("%d\n",min);
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1182
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者