20%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 0 。
40%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 2 。
100%的数据,满足 1 <= N,M <= 30 ; 0 <= T <= 30 。
spfa+暴力。
对于每一个格子,用spfa预处理出他到任何一个格子的至少要移除几个障碍。
然后暴力枚举需要移除障碍<=t的格子,输出最大距离。
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #define M 900000+5 #define pa pair<int,int> #define mp make_pair #include <queue> #define inf 0x3f3f3f3f using namespace std; struct data { double dis; int need; }r[M]; char s[100]; int f[5][3],tot=0,d[35][35],inq[35][35],n,m,t,a[35][35]; queue<pa> q; double dis[35][35][35][35]; int C(int x,int y) { return (x-1)*m+y; } bool ok(int x,int y) { if (x<1||y<1||x>n||y>m) return false; return true; } void spfa(int x,int y) { for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) d[i][j]=inf,inq[i][j]=0; d[x][y]=a[x][y]; q.push(mp(x,y)); inq[x][y]=1; while (!q.empty()) { pa p=q.front(); q.pop(); int xx=p.first,yy=p.second; inq[xx][yy]=0; for (int i=1;i<=4;i++) { int nx=xx+f[i][1],ny=yy+f[i][2]; if (ok(nx,ny)&&d[xx][yy]+a[nx][ny]<d[nx][ny]) { d[nx][ny]=d[xx][yy]+a[nx][ny]; if (!inq[nx][ny]) inq[nx][ny]=1,q.push(mp(nx,ny)); } } } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) r[++tot].dis=dis[i][j][x][y],r[tot].need=d[i][j]; } bool cmp(data a,data b) { return a.dis>b.dis; } int main() { f[1][1]=f[2][1]=0,f[1][2]=1,f[2][2]=-1; f[3][2]=f[4][2]=0,f[3][1]=1,f[4][1]=-1; scanf("%d%d%d",&n,&m,&t); for (int i=1;i<=n;i++) { scanf("%s",1+s); for (int j=1;j<=m;j++) a[i][j]=s[j]-'0'; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) for (int x=1;x<=n;x++) for (int y=1;y<=m;y++) dis[i][j][x][y]=sqrt((double)(x-i)*(x-i)+(y-j)*(y-j)); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) spfa(i,j); sort(r+1,r+1+tot,cmp); for (int i=1;i<=tot;i++) if (r[i].need<=t) { printf("%.6lf\n",r[i].dis); return 0; } return 0; }
原文地址:http://blog.csdn.net/regina8023/article/details/44517471