标签:
Description
Input
Output
Sample Input
2 2.5 4 ##### #S # # E# ##### 21 13 ############ #S## #E# # ## # # # # # # # # ### # # # # # # # # # # ## # # # ## # # # # ### # # # # ## # # # # # ## # # # # # ############
Sample Output
Case #1: 50.000% Case #2: 21.053%
Hint
1 #include<cstring> 2 #include<cstdio> 3 #include<iostream> 4 #include<algorithm> 5 #include<queue> 6 7 #define eps 1e-9 8 #define INF 0x3f3f3f3f 9 using namespace std; 10 11 struct node 12 { 13 int x,y; 14 double step; 15 friend bool operator < (node A,node B) 16 { 17 return A.step>B.step; 18 } 19 }; 20 21 priority_queue<node>que; 22 23 char g[105][105]; 24 int vis[105][105]; 25 double val[105][105];//存储每次BFS的最短路径值 26 int dir[][5]={{-1,0},{1,0},{0,-1},{0,1}}; 27 int x,y,xx,yy; 28 int n,m; 29 double aim; 30 31 32 bool judge(int a,int b) 33 { 34 if(a>=0&&a<n&&b>=0&&b<m) return true; 35 return false; 36 } 37 38 double bfs(double mid) 39 { 40 while(que.size()) que.pop(); 41 memset(vis,0,sizeof vis); 42 43 for(int i=0;i<n;i++) 44 for(int j=0;j<m;j++) 45 val[i][j]=INF; 46 47 node k; 48 k.x=x; 49 k.y=y; 50 k.step=0; 51 que.push(k); 52 53 while(que.size()) 54 { 55 k=que.top(); 56 que.pop(); 57 58 for(int i=0;i<4;i++) 59 { 60 node temp=k; 61 temp.x+=dir[i][0]; 62 temp.y+=dir[i][1]; 63 if(judge(temp.x,temp.y)&&g[temp.x][temp.y]!=‘#‘) 64 { 65 vis[temp.x][temp.y]=1; 66 double T_T; 67 if(i==0||i==1) T_T=mid; 68 else T_T=1; 69 temp.step+=T_T;//= =、 70 71 if(!vis[temp.x][temp.y]||(vis[temp.x][temp.y]&&temp.step<val[temp.x][temp.y]))//未访问过或者访问过但此时值更小,记录。 72 { 73 vis[temp.x][temp.y]=1; 74 val[temp.x][temp.y]=temp.step; 75 que.push(temp); 76 } 77 78 } 79 } 80 } 81 return val[xx][yy]; 82 } 83 84 int main() 85 { 86 int T; 87 double ans; 88 scanf("%d",&T); 89 for(int k=1;k<=T;k++) 90 { 91 scanf("%lf%d",&aim,&n); 92 getchar(); 93 for(int i=0;i<n;i++) 94 gets(g[i]); 95 96 m=strlen(g[0]); 97 98 for(int i=0;i<n;i++) 99 for(int j=0;j<m;j++) 100 if(g[i][j]==‘S‘) 101 { 102 x=i; 103 y=j; 104 } 105 else if(g[i][j]==‘E‘) 106 { 107 xx=i; 108 yy=j; 109 } 110 111 112 double r=0,l=1000000; 113 while(r+eps<l) 114 { 115 double mid=(r+l)/2; 116 if(bfs(mid/100)>aim) l=mid; 117 else r=mid; 118 } 119 ans=r; 120 printf("Case #%d: %.3lf%%\n",k,ans); 121 } 122 }
Maze Stretching Poj3897 二分+BFS
标签:
原文地址:http://www.cnblogs.com/wsaaaaa/p/4493414.html