1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 int n,m,T; 7 double ans=0; 8 bool mp[31][31],inq[31][31],vis[31][31]; 9 int dis[31][31]; 10 int dx[4]={1,-1,0,0}; 11 int dy[4]={0,0,-1,1}; 12 struct data{ 13 int x,y; 14 }q[100000]; 15 void getans(int x,int y) 16 { 17 for(int i=x;i<=n;i++) 18 for(int j=1;j<=m;j++) 19 if(dis[i][j]<=T&&(y-j)*(y-j)+(x-i)*(x-i)>ans) 20 ans=(y-j)*(y-j)+(x-i)*(x-i); 21 } 22 void search(int xx,int yy) 23 { 24 int nowx,nowy,i,t=1,w=1,nx,ny; 25 q[1].x=xx;q[1].y=yy; 26 memset(inq,0,sizeof(inq)); 27 memset(dis,127,sizeof(dis)); 28 inq[xx][yy]=1;dis[xx][yy]=mp[xx][yy]; 29 while(t<=w) 30 { 31 nowx=q[t].x;nowy=q[t].y; 32 t++; 33 for(i=0;i<4;i++) 34 { 35 nx=nowx+dx[i];ny=nowy+dy[i]; 36 if(nx>n||nx<xx||ny>m||ny<1)continue; 37 if(dis[nowx][nowy]+mp[nx][ny]<dis[nx][ny]) 38 { 39 dis[nx][ny]=dis[nowx][nowy]+mp[nx][ny]; 40 if(!inq[nx][ny]) 41 { 42 q[++w].x=nx;q[w].y=ny;inq[nx][ny]=1; 43 } 44 } 45 } 46 inq[nowx][nowy]=0; 47 } 48 getans(xx,yy); 49 } 50 int main() 51 { 52 scanf("%d%d%d",&n,&m,&T); 53 char str[40]; 54 for(int i=1;i<=n;i++) 55 { 56 scanf("%s",str); 57 for(int j=0;j<m;j++) 58 mp[i][j+1]=str[j]-'0'; 59 } 60 for(int i=1;i<=n;i++) 61 for(int j=1;j<=m;j++) 62 {search(i,j);} 63 printf("%.6lf",sqrt(ans)); 64 return 0; 65 }
以每一个点为中心进行宽搜,存到每个点移去的最小障碍数,然后枚举更新最优值。