#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;
}
poj3897
最新推荐文章于 2017-10-06 21:19:02 发布