分析:
1. n,m范围都挺小的。那我们可以以每个点为起点,求出到达另外的点要移动的最少的障碍,然后枚举每一个
点,只如果移动的障碍数在规定范围内,就求出他与起点的距离,取最大的一个
代码:
#include<bits/stdc++.h>
#define dl double
using namespace std;
const int N=35;
int n,m,t;
int a[N][N],dis[N][N];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
inline int check(int x,int y)
{
return x<1||x>n||y<1||y>m;
}
inline void dfs(int x,int y,int z)
{
if(z>t) return ;
if(dis[x][y]<=z) return ;
dis[x][y]=z;
for (int i=0;i<4;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(check(xx,yy)) continue;
if(a[xx][yy]) dfs(xx,yy,z+1);
else dfs(xx,yy,z);
}
}
int main()
{
cin>>n>>m>>t;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
char c;cin>>c;
a[i][j]=c-'0';
}
dl ans=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
if(a[i][j]) continue;
memset(dis,0x3f,sizeof(dis));
dfs(i,j,0);
for (int p=1;p<=n;p++)
for (int k=1;k<=m;k++)
if(dis[p][k]<=t)
ans=max(ans,sqrt((dl)(p-i)*(dl)(p-i)+(dl)(k-j)*(dl)(k-j)));
}
printf("%.6lf\n",ans);
return 0;
}