题意,给你一个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;
}

/*

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

*/

poj 3897 Maze Stretching 二分+A*搜索的更多相关文章

  1. {POJ}{3897}{Maze Stretching}{二分答案+BFS}

    题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据. 思路:由于是单调的,可以用二分答案,然后BFS验证.这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以.好久不写图 ...

  2. POJ 3273 Monthly Expense二分查找[最小化最大值问题]

    POJ 3273 Monthly Expense二分查找(最大值最小化问题) 题目:Monthly Expense Description Farmer John is an astounding a ...

  3. POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: ...

  4. 搜索 || BFS || POJ 2157 Maze

    走迷宫拿宝藏,拿到所有对应的钥匙才能开门 *解法:从起点bfs,遇到门时先放入队列中,取出的时候看钥匙够不够决定开不开门,如果不够就把它再放回队列继续往下走,当队列里只有几个门循环的时候就可以退出,所 ...

  5. POJ - 1426 Find The Multiple(搜索+数论)

    转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1303946967 以下内容属于以上这位dalao http://poj.org/problem? ...

  6. POJ 3579 3685(二分-查找第k大的值)

    POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的 ...

  7. POJ 1088 滑雪(记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 92384   Accepted: 34948 Description ...

  8. hiho_1139_二分+bfs搜索

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

  9. poj 3258 River Hopscotch(二分+贪心)

    题目:http://poj.org/problem?id=3258 题意: 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L. 河中有n块石头,每块石头到S都 ...

随机推荐

  1. 转:ShellExecute函数与ShellExecuteEx函数

    ShellExecute函数 ShellExecute函数原型及參数含义例如以下: function ShellExecute(hWnd: HWND; Operation, FileName, Par ...

  2. 让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式

    让低版本的IE浏览器 强制渲染为IE8 或者 以上 浏览器模式 那么就要用下面的方法:让网页兼容ie9 复制代码 代码如下: <!–[if lte IE 8]> <meta http ...

  3. 《Visual Studio Magazine》2013年读者选择奖—软件类

    <Visual Studio Magazine>会在每年的下半年向读者发出投票邀请,读者将在28个大类,超过500个开发工具的名单中选出他们认为最好的产品,以票数评出各分类的金.银.铜奖. ...

  4. 单独一个img标签的居中显示

    针对页面当中通过img插入图片的时候,要保证这个图片在页面内容当中居中,一般的做法是在外面套一个div,通过给div加入 {margin:0 auto;} 来控制图片的居中. 那么如果针对后台上传的图 ...

  5. asp.net访问WebService的各种方式

    WebService的访问形式主要有:SOAP调用.XMLHTTP POST.GET调用.MicroSoft.XMLDOMC调用.webbehavior.htc调用 我们知道的在C#后台本地调用Web ...

  6. Android项目--Json解析

    在过去的一段时间里,我希望做一个天气的应用,但是由于老版的天气接口已经不能用了.只能更新到2014年3月4日. 不过有些东西,哪来学习一下,也是可以的. 比如:http://m.weather.com ...

  7. redmine的邮件配置

    redmine的邮件配置 2012-01-04 18:09:21|  分类: 默认分类|举报|字号 订阅     redmine里要用到邮件通知,本来以为很是简单,网上也有许多教程,谁知忙活了一下午, ...

  8. BitMap画图

    package com.example.examples_05_07; import android.content.Context; import android.graphics.Bitmap; ...

  9. 动手实现Expression翻译器1

    动手实现Expression翻译器 – Part I   伴随.Net3.5到来的Expression,围绕着它产生了各种各样有趣的技术与应用,Linq to object.Linq to sql.L ...

  10. 一个ASP.NET Web API 2.0应用

    在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.N ...