1 条题解

  • 0
    @ 2025-11-30 16:28:07

    C++ :

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    #include<cmath>
    #include<iomanip>
    using namespace std;
    int n,m,t,dis[50][50];
    char a[50][50];
    int dx[4]={1,0,-1,0},
    	dy[4]={0,1,0,-1};
    double maxdist=0;
    void init();
    void spfa(int,int);
    double dist(int,int,int,int);
    void work();
    int main()
    {
    	//freopen("distance.in","r",stdin);
    	//freopen("distance.out","w",stdout);
    	init();
    	work();
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }
    void init()
    {
    	cin>>n>>m>>t;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)cin>>a[i][j];
    }
    double dist(int x1,int y1,int x2,int y2)
    {
    	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    }
    void spfa(int x,int y)
    {
    	queue<int> q1,q2;
    	q1.push(x);q2.push(y);
    	int x1,y1,x2,y2,tot=0;
    	memset(dis,0x7f,sizeof(dis));
    	dis[x][y]=0;
    	while(!q1.empty())
    	{
    		x1=q1.front();y1=q2.front();
    		if(dist(x,y,x1,y1)>maxdist) maxdist=dist(x,y,x1,y1);
    		for(int i=0;i<4;i++)
    		{
    			x2=x1+dx[i];y2=y1+dy[i];
    			if(x2>0 && x2<=n && y2>0 && y2<=n)
    			{
    				if(a[x2][y2]=='1') tot=dis[x1][y1]+1;//如果x2,y2点事障碍则
    										//x2,y2到原点的最短距离加1 
    				else tot=dis[x1][y1];
    				if(tot>t) continue;//这是一个小优化,如果长度大于t就不用更新x2,y2这点了
    				if(tot<dis[x2][y2])
    				{
    					dis[x2][y2]=tot;
    					q1.push(x2);q2.push(y2);
    				}
    			}			
    		}
    		q1.pop();q2.pop();
    	}
    }
    void work()
    {
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			if(a[i][j]=='0')spfa(i,j);
    	cout.setf(ios::fixed);
    	cout<<setprecision(6)<<maxdist<<endl;
    }
    
    • 1

    信息

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