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 }

以每一个点为中心进行宽搜,存到每个点移去的最小障碍数,然后枚举更新最优值。

posted on 2016-03-06 22:29  xiyuedong  阅读(125)  评论(0编辑  收藏  举报