poj3897

#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <cmath>
#include <string>
using namespace std;

#define eps 1e-8
#define maxn 105
struct position{int x;int y;};
position S,E;
queue<position>Q;
bool vis[maxn][maxn];
char map[maxn][maxn];
double dis[maxn][maxn];
int N,M;
double L;

int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
double BFS(double x)
{
	for(int i=1;i<=N;i++)
		for(int j=1;j<=M;j++)
			dis[i][j]=10000000000000000.0;
	memset(vis,0,sizeof(vis));
	while(!Q.empty())Q.pop();
	Q.push(S);
	vis[S.x][S.y]=1;
	dis[S.x][S.y]=0.0;
	while(!Q.empty())
	{
		position u=Q.front();
		Q.pop();
		vis[u.x][u.y]=0;
		double ss;
		for(int j=0;j<4;j++)
		{
			if(j<2)ss=x;
			else ss=1.0;
			int tx=u.x+dx[j];
			int ty=u.y+dy[j];
			if((map[tx][ty]==' '||map[tx][ty]=='E'||map[tx][ty]=='S')&&dis[u.x][u.y]+ss<dis[tx][ty])
			{
				if(!vis[tx][ty])
				   {
					   vis[tx][ty]=1;
					   position p;
					   p.x=tx,p.y=ty;
					   Q.push(p);
				    }
				dis[tx][ty]=dis[u.x][u.y]+ss;
			}
		}
	}
	return dis[E.x][E.y];
}

double search()
{
	double l=0.0;
	double r=1000.0;
	double mid;
	while(fabs(l-r)>eps)
	{
		mid=0.5*(l+r);
		double H=BFS(mid);
		if(fabs(H-L)<eps)return 100.0*mid;
		if(H>L)r=mid;
		else l=mid;
	}
	return 100.0*l;
}
int main()
{
	int kase;
	int id=0;
	for(cin>>kase;kase--;)
	{
		scanf("%lf%d",&L,&N);
		memset(map,0,sizeof(map));
		getchar();
		for(int i=1;i<=N;i++)
	    {
			gets(map[i]+1);
			M=strlen(map[i]+1);
			for(int j=1;map[i][j];j++)
				if(map[i][j]=='E')E.x=i,E.y=j;
				else if(map[i][j]=='S')S.x=i,S.y=j;
		}

		printf("Case #%d: %.3lf%%\n",++id,search());

	}
	
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值