Description
windy有一块矩形土地,被分为 N*M 块 1*1 的小格子。 有的格子含有障碍物。 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离。 如果从格子A不可以走到格子B,就没有距离。 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以从X走到Y。 如果windy可以移走T块障碍物,求所有格子间的最大距离。 保证移走T块障碍物以后,至少有一个格子不含有障碍物。
Input
输入文件maxlength.in第一行包含三个整数,N M T。 接下来有N行,每行一个长度为M的字符串,‘0‘表示空格子,‘1‘表示该格子含有障碍物。
Output
输出文件maxlength.out包含一个浮点数,保留6位小数。
Sample Input
【输入样例一】
3 3 0
001
001
110
【输入样例二】
4 3 0
001
001
011
000
【输入样例三】
3 3 1
001
001
001
3 3 0
001
001
110
【输入样例二】
4 3 0
001
001
011
000
【输入样例三】
3 3 1
001
001
001
Sample Output
【输出样例一】
1.414214
【输出样例二】
3.605551
【输出样例三】
2.828427
1.414214
【输出样例二】
3.605551
【输出样例三】
2.828427
连向空的边长为0,连向墙的边长为1
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define N (100+5)
#define id(x,y) (x-1)*m+y
using namespace std;
int n,m,t,a[N][N];
double ans;
int head[N*N],num_edge;
int dis[1001][1001];
bool used[N*N];
int dx[6]={0,1,-1,0,0},dy[6]={0,0,0,1,-1};
char st[N];
struct node
{
int to,next,len;
}edge[N*N*N];
queue<int>q;
void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
edge[num_edge].len=l;
head[u]=num_edge;
}
void Spfa(int x,int y)
{
int s=id(x,y);
dis[s][s]=0;
used[s]=true;
q.push(s);
while (!q.empty())
{
int x=q.front(); q.pop();
for (int i=head[x];i!=0;i=edge[i].next)
if (dis[s][x]+edge[i].len<dis[s][edge[i].to])
{
dis[s][edge[i].to]=dis[s][x]+edge[i].len;
if (!used[edge[i].to])
{
used[edge[i].to]=true;
q.push(edge[i].to);
}
}
used[x]=false;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for (int i=1;i<=n;++i)
{
scanf("%s",st);
for (int j=1;j<=m;++j)
a[i][j]=st[j-1]-‘0‘;
}
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
for (int k=1;k<=4;++k)
if (i+dx[k]>=1 && i+dx[k]<=n && j+dy[k]>=1 && j+dy[k]<=m)
add(id(i,j) , id(i+dx[k],j+dy[k]) , a[i+dx[k]][j+dy[k]]);
memset(dis,0x7f,sizeof(dis));
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
Spfa(i,j);
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
for (int k=1;k<=n;++k)
for (int l=1;l<=m;++l)
if ( dis[id(i,j)][id(k,l)] + (a[i][j]==1)<=t )
ans=max(ans,sqrt((i-k)*(i-k)+(j-l)*(j-l)));
printf("%0.6lf",ans);
}