[二分][记搜]JZOJ 3522 迷宫花园
Posted mastervan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[二分][记搜]JZOJ 3522 迷宫花园相关的知识,希望对你有一定的参考价值。
分析
二分+记忆化搜索,注意BFS中已在队列中的不要反复加入,会T
#include <iostream> #include <cstdio> #include <queue> #include <cmath> using namespace std; const int N=110; struct Point { int x,y; }s,e; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; double f[N][N]; char ch[N][N]; int t,r,c; double l,v; bool inqueue[N][N]; double Cost(Point a,Point b) { if (abs(a.y-b.y)==1) return 1.0; else return v; } bool Judge(Point a,Point b) { if (b.x<1||b.x>r||b.y<1||b.y>c) return 0; if (ch[b.x][b.y]==‘#‘) return 0; if (f[a.x][a.y]+Cost(a,b)>f[b.x][b.y]) return 0; return 1; } void Bfs() { queue<Point> q; while (!q.empty()) q.pop(); for (int i=1;i<=r;i++) for (int j=1;j<=c;j++) f[i][j]=2147483647.0; q.push(s);f[s.x][s.y]=0;inqueue[s.x][s.y]=1; while (!q.empty()) { Point p=q.front();q.pop(); for (int i=0;i<4;i++) if (Judge(p,(Point){p.x+dx[i],p.y+dy[i]})) { Point to=(Point){p.x+dx[i],p.y+dy[i]}; f[to.x][to.y]=f[p.x][p.y]+Cost(p,to); if (!inqueue[to.x][to.y]) q.push(to); inqueue[to.x][to.y]=1; } inqueue[p.x][p.y]=0; } } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); scanf("%d",&t); for (;t;t--) { scanf("%lf%d%d",&l,&r,&c); for (int i=1;i<=r;i++) for (int j=1;j<=c;j++) { do { scanf("%c",&ch[i][j]); } while (ch[i][j]!=‘#‘&&ch[i][j]!=‘E‘&&ch[i][j]!=‘S‘&&ch[i][j]!=‘ ‘); if (ch[i][j]==‘E‘) e.x=i,e.y=j; if (ch[i][j]==‘S‘) s.x=i,s.y=j; } double ll=1e-7,rr=10.0; while (rr-ll>=1e-7) { v=(ll+rr)/2.0; Bfs(); if (f[e.x][e.y]<l) ll=v+1e-7; else rr=v; } printf("%.5lf ",v); } }
以上是关于[二分][记搜]JZOJ 3522 迷宫花园的主要内容,如果未能解决你的问题,请参考以下文章