bzoj 1295
思路:我们可以暴力得出已a[i][j]为起点到其他点所去掉的障碍物。那么可以得出该点到能到的点的最大距离,最后再取一个max
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
double ans=0;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int mp[31][31],dis[31][31];
int vis[40][40];
struct node{
int x,y;
node(int xx,int yy){
x=xx;y=yy;
}
};
bool check(int x,int y){
if(x<1||y<1||x>n||y>m) return true;
return false;
}
void getans(int x,int y)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(dis[i][j]<=t&&sqrt((y-j)*(y-j)+(x-i)*(x-i))>ans)
ans=sqrt((y-j)*(y-j)+(x-i)*(x-i));
}
void hh(int x,int y){
memset(vis,0,sizeof(vis));
memset(dis,127,sizeof(dis));
queue<node > p;
dis[x][y]=mp[x][y];
p.push(node(x,y));
while(!p.empty()){
node xy=p.front();p.pop();
int xxx=xy.x,yyy=xy.y; vis[x][y]=1;
for(int i=0;i<4;i++){
int x1=xxx+dx[i];
int y1=yyy+dy[i];
if(vis[x1][y1]||check(x1,y1)) continue;
if(!mp[x1][y1]&&dis[x1][y1]>dis[xxx][yyy]){
dis[x1][y1]=dis[xxx][yyy];
p.push(node(x1,y1));
}
else if(mp[x1][y1]&&dis[x1][y1]>dis[xxx][yyy]+1){
dis[x1][y1]=dis[xxx][yyy]+1;
p.push(node(x1,y1));
}
}
}
getans(x,y);
}
int main(){
scanf("%d%d%d",&n,&m,&t);
string str;
memset(mp,0,sizeof(mp));
for(int i=1;i<=n;i++){
cin>>str;
for(int j=0;j<m;j++){
mp[i][j+1]=str[j]-'0';
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
hh(i,j);
printf("%.6lf\n",ans);
return 0;
}