3522. 【NOIP2013模拟11.7B组】迷宫花园

Description

给定一个一定存在从起点到终点的路径的四联通迷宫。已知Tar左右方向移动的时间为1,上下移动的时间为未知实数v。求当Tar从起点到终点的最短移动时间为已知实数L时,未知实数v是多少。

Input

输入数据包含多个测试点。第一行为一个整数T,表示测试点的数目。

对于每一个测试点,第一行包含实数L和两个整数R,C。R为迷宫的上下长度,C为迷宫的左右长度。

之后的R行,每行包含C个字符。其中空格表示空地,S表示起点,E表示终点,#表示围墙。

Output

对于每一个测试点,在单独的一行内输出未知实数v,输出保留5位小数。

Sample Input

2                                 

2.5 4 5                           

#####

#S  #

#  E#

#####

21 13 12

############

#S##     #E#

# ##  #  # #

#   # #  # #

### # #  # #

#   # #  # #

#  ## #  # #

##  # #  # #

### # #  # #

##  # #  # #

#  ## #    #

#     #    #

############

Sample Output

0.50000

0.21053

Data Constraint

20%的数据,1≤ R,C ≤ 10。

100%的数据,1≤ R,C ≤ 100,0≤ v <10。

Solution

二分+最短路径算法

先二分一个v然后用1和v当做边权跑一边SPFA,再看看终点如果比给定距离小就将v的值增大,否则就将v的值变小。

 

Code

#include
#include
#include
#include
#include
#define N 110
using namespace std;
int T,n,m,sx,sy,tx,ty,bz[N][N],d[N*N][2],fx[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
double l,r,k,mid,ans,f[N][N];
char a[N][N];
int check(double v){
	memset(f,127,sizeof(f));
	memset(bz,0,sizeof(bz));
	d[1][0]=sx;d[1][1]=sy;
	bz[sx][sy]=1;f[sx][sy]=0;
	int h=0,t=1;
	while(h++1);
			if(xx>0&&yy>0&&xx<=n&&yy<=m&&a[xx][yy]!='#'){
				if(f[xx][yy]>f[x][y]+s){
					f[xx][yy]=f[x][y]+s;
					if(!bz[xx][yy]){
						bz[xx][yy]=1;
						d[++t][0]=xx;
						d[t][1]=yy;
					}
				}
			}
		}
		bz[x][y]=0;
	}
	if(f[tx][ty]<=k) return 1;
	else return 0;
}
int main(){
	freopen("maze.in","r",stdin);
	freopen("maze.out","w",stdout);
	scanf("%d\n",&T);
	while(T--){
		scanf("%lf%d%d\n",&k,&n,&m);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				scanf("%c",&a[i][j]);
				if(a[i][j]=='S'){sx=i;sy=j;}
				if(a[i][j]=='E'){tx=i;ty=j;}
			}
			scanf("\n");
		}
		l=0.0000001;r=k;
		while(l<=r){
			mid=(l+r)/2;
			if(check(mid)){ans=mid;l=mid+0.0000001;}
			else{r=mid-0.0000001;}
		}
		printf("%.5lf\n",ans);ans=0;
	}
	return 0;
}


作者:zsjzliziyang 
QQ:1634151125 
转载及修改请注明 
本文地址:https://blog.csdn.net/zsjzliziyang/article/details/83272962

 

 

 

你可能感兴趣的:(题目,spfa,二分,二分,SPFA)