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 ",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hhxj/p/7002828.html