题意,给你一个l,和一个地图,让你从起点走到终点,使得路程刚好等于l。

你可以选择一个系数,把纵向的地图拉伸或收缩,比如你选择系数0.5,也就是说现在上下走一步消耗0.5的距离,如果选择系数3,也就是说上下一步消耗3的距离。

左右不能改变。

Hint中提示了答案在0--10之间,其实就透露出了二分的思想。

我们对系数P进行二分,对每一个系数P进行一次bfs,如果可以在小于等于l的步数内找到解,则增加下界,否则减小上界。

由于上下和左右的消耗值不相同,所以我们采用A*算法,设估价值为当前点到目标点的哈弗曼距离(注意上下距离要乘上系数P),然后利用优先队列搜索。

我试了几下,精度开到1e-6才不会wa

如果用普通的bfs做,注意不能一遇到终点就结束,有可能丢失掉最优解。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
char map[105][105];
int CAS;
double l;
int n,len;
int end,st;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
struct node
{double dis;int x;int y;double h;bool operator < (const node &a) const{return dis+h>a.dis+h;}
}start;
double geth(int x,int y,double k)
{double h=0;int ex=end/len;int ey=end%len;return abs(ey-y)+abs(ex-x)*k;
}
bool isok(int x,int y)
{return x>=0&&x<n&&y>=0&&y<len&&map[x][y]!='#';
}
double vis[105][105];
bool bfs(double k)
{for(int i=0;i<n;i++)for(int j=0;j<len;j++)vis[i][j]=100000000;priority_queue<node> q;q.push(start);vis[start.x][start.y]=1;node tmp,tt;while(!q.empty()){tmp=q.top();q.pop();for(int d=0;d<4;d++){tt=tmp;tt.x=tmp.x+dx[d];tt.y=tmp.y+dy[d];if(isok(tt.x,tt.y)){tt.h=geth(tt.x,tt.y,k);if(d<=1) tt.dis+=k;else tt.dis+=1;if(tt.dis<vis[tt.x][tt.y]) vis[tt.x][tt.y]=tt.dis;else continue;if(tt.x==end/len&&tt.y==end%len){if(tt.dis<=l) return true;else return false;}q.push(tt);}}}return false;
}
int main()
{int cas;CAS=1;scanf("%d",&cas);while(cas--){scanf("%lf%d",&l,&n);getchar();for(int i=0;i<n;i++)gets(map[i]);len=strlen(map[0]);for(int i=0;i<n;i++)for(int j=0;j<len;j++){if(map[i][j]=='S'){st=i*len+j;}if(map[i][j]=='E'){end=i*len+j;}}start.dis=0;start.x=st/len;start.y=st%len;double l=0;double r=11;double mid=(l+r)/2.0;while(r-l>1e-6){//     cout<<l<<' '<<r<<' '<<mid<<endl;mid=(l+r)/2.0;if(bfs(mid)) l=mid;else r=mid;}printf("Case #%d: %.3f%%\n",CAS++,mid*100);}return 0;
}

/*

我是一只奔跑的小菜鸡……

*/

转载于:https://www.cnblogs.com/jiangu66/p/3198831.html

poj 3897 Maze Stretching 二分+A*搜索相关推荐

  1. 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching

    启发式搜索主要就是加速,其实不用也可以过.二分L然后每次看最短路是多少,估价函数就是曼哈顿距离,然后注意精度误差就好了Tip:在POJ上交这道题目记得用c++千万不要用g++ #include < ...

  2. poj 1064 java_poj 1064(二分答案)

    题意: 有N条绳子,长度分别为 length[1,2,3,........,N]. 如果从它们中切割出K条长度相同的绳子,这K条绳子每条最长有多长? 结果保留两位小数. 题解: 二分可能的长度. AC ...

  3. Linux等比数列脚本求和,POJ 1845 (约数和+二分等比数列求和)

    题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1)*(P2^K2)*(P3^K3).....*(Pn^Kn)的形式.其中Pn ...

  4. POJ - 1905 (几何+二分)

    POJ - 1905 (几何+二分) 题目正文如下: When a thin rod of length L is heated n degrees, it expands to a new leng ...

  5. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  6. POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)

    题目链接:点击查看 题目大意:给出n个牛奶机器,再给出m只奶牛,每个机器只能让最多k只牛一起挤奶,现在问如何分配奶牛,能让最远的那只奶牛到达机器的距离最小 题目分析:很综合的一道题目了,不算很难,但比 ...

  7. 【牛客 - 318F】关于我转生变成史莱姆这档事(二分,搜索)

    题干: 有一天,利姆鲁在这个世界最重要的人静被魔王带走,并将其困在一个n*n的迷宫内的某一处,迷宫的每个格子都可能有一只魔物,魔物的攻击力为a[i][j],因而利姆鲁只有当攻击力大于等于a[i][j] ...

  8. (二分+区间搜索 )Mountain Walking(poj2110/poj2922)

    题目 农夫约翰和贝西牛已经开始了其中一个"积极"的假期.他们整天都在山里散步,然后在一天结束时,他们厌倦了回到度假小屋. 由于攀爬需要大量能量并且已经疲惫,他们希望使用其最高和最低 ...

  9. poj 3258 River Hopscotch 二分答案

    题目地址: http://poj.org/problem?id=3258 题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况) ...

  10. POJ 1064 Cable master (二分答案)

    题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...

最新文章

  1. GridSearchCV 与 RandomizedSearchCV 调参
  2. 15. 二维数组中的查找【难度: 一般 / 知识点: 思维】
  3. mysql内部_使用mysql中的内部加入
  4. Web前端开发人员和设计师必读文章推荐【系列六】
  5. [资源分享] 推荐两本电子书
  6. sql1032n sql6048n db2start启动不了 db2修改hostname
  7. 在ASP.NET应用启动的时候初始化的几种方法
  8. 自制Anki选择题模板(支持桌面版/移动版)
  9. 网络打不其他计算机的共享文件,快速解决“电脑无法访问共享文件夹”的4种方法!...
  10. android代码计时,android秒表计时代码
  11. 微信小程序大转盘抽奖
  12. 高考30条干货分享!去哪能找到高质量2021高考学习资源?
  13. python实训day8
  14. 2021-06-29 连续非空子序列
  15. 使用Arduino与L298N(红板) 驱动直流电机
  16. word20161229
  17. Tableau表计算(2):计算依据
  18. 你不知道的USB知识二——USB认证
  19. 量化金融分析AQF(5):金融数据获取、清洗、整理和存储(Yahoo、Tushare)
  20. AHP算法MATLAB代码

热门文章

  1. VM虚拟机系统时间同步网络时间并登录用户自动校正时间
  2. 【9.28作业】论XX信息系统建设项目的范围管理
  3. linux常用命令(3)——系统管理1
  4. 【Vegas原创】xp_sendmail提示“邮件已发送”但收不到邮件的解决方法
  5. 48V自动启停的Stateflow应用
  6. 09月27日 pytorch与resnet(二)
  7. 3月3日 单灭点、双灭点、单应矩阵求解相机姿态,世界坐标-相机坐标-图像坐标-像素坐标四个坐标系的变换关系,通过Vanishing Points计算焦距和像心
  8. Oracle数据库出现问题时,这十个脚本帮你快速定位原因
  9. 李航教授展望自然语言对话领域:现状与未来
  10. Java中的代理模式--静态代理和动态代理