题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据。

思路:由于是单调的,可以用二分答案,然后BFS验证。这里用优先队列,每次压入也要进行检查(dis大小)防止数据过多,A*也可以。好久不写图论,WA成狗

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <memory>
#include <cmath>
#include <bitset>
#include <queue>
#include <vector>
#include <stack>
using namespace std; #define CLR(x,y) memset(x,y,sizeof(x))
#define MIN(m,v) (m)<(v)?(m):(v)
#define MAX(m,v) (m)>(v)?(m):(v)
#define ABS(x) ((x)>0?(x):-(x))
#define rep(i,x,y) for(i=x;i<y;++i) #define SET_NODE(no,a,b,c) {no.x=a;no.y=b;no.val=c;} const int MAXN = 200;
const double INF = 1<<30;
const double EPS = 0.000001; int dir[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int tag[MAXN];
char g[MAXN][MAXN];
double dist;
bool visit[MAXN][MAXN];
double dis[MAXN][MAXN];
typedef struct
{
int x,y;
double val;
}Node;
Node s,e,node;
bool operator < (const Node& a,const Node& b)
{
return a.val > b.val;
}
bool check(const int& x, const int& y)
{
if(x<0||x>=n) return false;
if(y<0||y>=m) return false;
if(g[x][y] == '#') return false;
if(visit[x][y]) return false;
return true;
} double BFS(double len)
{
int i,j,k;
Node tmp; priority_queue<Node> q; q.push(s); CLR(visit,0); rep(i,0,n)
rep(j,0,m)
dis[i][j] = INF; while(!q.empty())
{
node = q.top();
q.pop();
visit[node.x][node.y] = true; if(node.x == e.x && node.y == e.y)
return node.val; if(check(node.x+1,node.y)){
SET_NODE(tmp,node.x+1,node.y,node.val+len);
if(tmp.val<dis[tmp.x][tmp.y])
{
dis[tmp.x][tmp.y] = tmp.val;
q.push(tmp);
}
}
if(check(node.x-1,node.y)){
SET_NODE(tmp,node.x-1,node.y,node.val+len);
if(tmp.val<dis[tmp.x][tmp.y])
{
dis[tmp.x][tmp.y] = tmp.val;
q.push(tmp);
}
}
if(check(node.x,node.y+1)){
SET_NODE(tmp,node.x,node.y+1,node.val+1);
if(tmp.val<dis[tmp.x][tmp.y])
{
dis[tmp.x][tmp.y] = tmp.val;
q.push(tmp);
}
}
if(check(node.x,node.y-1)){
SET_NODE(tmp,node.x,node.y-1,node.val+1);
if(tmp.val<dis[tmp.x][tmp.y])
{
dis[tmp.x][tmp.y] = tmp.val;
q.push(tmp);
}
}
}
return 0;
}
void Solve()
{
int i,j,k,t,tt; scanf("%d",&tt);
rep(t,1,tt+1){
scanf("%lf%d",&dist,&n);
rep(i,0,n)
{
getchar();
gets(&g[i][0]);
}
m = strlen(g[0]);
rep(i,0,n)
rep(j,0,m)
if(g[i][j]=='S')
{
s.x = i;
s.y = j;
}else if (g[i][j]=='E')
{
e.x = i;
e.y = j;
}
s.val = 0; double low = 0;
double high = 10;
double mid = (low+high)/2;
double res = 0;
while(ABS(low-high)>EPS)
{
mid = (low+high)/2;
res = BFS(mid);
//printf("[%f %f %f]\n",mid,res,dist);
if(res < dist+EPS)
low = mid ;
else
high = mid;
}
printf("Case #%d: %.3f%%\n",t,mid*100);
}
}
int main()
{
Solve();
return 0;
}

{POJ}{3897}{Maze Stretching}{二分答案+BFS}的更多相关文章

  1. poj 3897 Maze Stretching 二分+A*搜索

    题意,给你一个l,和一个地图,让你从起点走到终点,使得路程刚好等于l. 你可以选择一个系数,把纵向的地图拉伸或收缩,比如你选择系数0.5,也就是说现在上下走一步消耗0.5的距离,如果选择系数3,也就是 ...

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

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

  3. POJ 3484 Showstopper(二分答案)

    [题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...

  4. POJ 3579 Median(二分答案+Two pointers)

    [题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...

  5. POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)

    <题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...

  6. POJ 3061 Subsequence【二分答案】||【尺取法】

    <题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...

  7. POJ 3122 Pie【二分答案】

    <题目链接> 题目大意: 将n个半径不一但是高度为1的蛋糕分给 F+1个人,每个人分得蛋糕的体积应当相同,并且需要注意的是,每个人分得的整块蛋糕都只能从一个蛋糕上切下来,而不是从几个蛋糕上 ...

  8. POJ 3579 Median 【二分答案】

    <题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...

  9. [CSP-S模拟测试]:maze(二分答案+最短路)

    题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...

随机推荐

  1. 如何用Matplotlib绘制三元函数

    #!/usr/bin/env python #coding=GBK from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm ...

  2. chmod、chown、chgrp的意思

    文件权限管理chown->change owner 改变文件所有者chown test install.log -将install.log这个文件的所有者改为test用户 chgrp->c ...

  3. [LeetCode] 8. String to Integer (atoi)

    Implement atoi to convert a string to an integer. public class Solution { public int myAtoi(String s ...

  4. IE8、IE9浏览器下报:JSON未定义 解决方法

    IE8.IE9浏览器下报:JSON未定义的问题 解决方法: 在jsp中引入如下代码 <!-- 解决 IE8.IE9 下显示混乱的问题--><% String browserStrin ...

  5. win8安装SQL Server2008企业版

    win8 系统,安装的时候要先安装SQL Server2008企业版 再安装Visual studio2010,不然SQL Server会有问题.

  6. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  7. 如何消除移动端a标签点击时的蓝色底色以及a标签link、visited、hover、active的顺序

    1.消除a标签移动端点击时的蓝色底色 -webkit-tap-highlight-color:transparent 2.link.visited.hover.active的顺序 a:link{tex ...

  8. sharedPreferences的用法

    做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连 接跟操作等耗时大大影响了程序的效率,因此我们使用键值这 ...

  9. 116、Android获取Manifest中<meta-data>元素的值

    在AndroidManifest.xml中,<meta-data>元素可以作为子元素, 被包含在<activity>.<application> .<serv ...

  10. problem during schema create,statement create sequence act_evt_log_seq

    今天在调试程序的时候出现"problem during schema create,statement create sequence act_evt_log_seq"这个错误,跟 ...