{POJ}{3897}{Maze Stretching}{二分答案+BFS}
题意:给定迷宫,可以更改高度比,问如何使最短路等于输入数据。
思路:由于是单调的,可以用二分答案,然后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}的更多相关文章
- poj 3897 Maze Stretching 二分+A*搜索
题意,给你一个l,和一个地图,让你从起点走到终点,使得路程刚好等于l. 你可以选择一个系数,把纵向的地图拉伸或收缩,比如你选择系数0.5,也就是说现在上下走一步消耗0.5的距离,如果选择系数3,也就是 ...
- POJ 1064 Cable master (二分答案)
题目链接:http://poj.org/problem?id=1064 有n条绳子,长度分别是Li.问你要是从中切出m条长度相同的绳子,问你这m条绳子每条最长是多少. 二分答案,尤其注意精度问题.我觉 ...
- POJ 3484 Showstopper(二分答案)
[题目链接] http://poj.org/problem?id=3484 [题目大意] 给出n个等差数列的首项末项和公差.求在数列中出现奇数次的数.题目保证至多只有一个数符合要求. [题解] 因为只 ...
- POJ 3579 Median(二分答案+Two pointers)
[题目链接] http://poj.org/problem?id=3579 [题目大意] 给出一个数列,求两两差值绝对值的中位数. [题解] 因为如果直接计算中位数的话,数量过于庞大,难以有效计算, ...
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
- POJ 3122 Pie【二分答案】
<题目链接> 题目大意: 将n个半径不一但是高度为1的蛋糕分给 F+1个人,每个人分得蛋糕的体积应当相同,并且需要注意的是,每个人分得的整块蛋糕都只能从一个蛋糕上切下来,而不是从几个蛋糕上 ...
- POJ 3579 Median 【二分答案】
<题目链接> 题目大意: 给出 N个数,对于存有每两个数的差值的序列求中位数,如果这个序列长度为偶数个元素,就取中间偏小的作为中位数. 解题分析: 由于本题n达到了1e5,所以将这些数之间 ...
- [CSP-S模拟测试]:maze(二分答案+最短路)
题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...
随机推荐
- VR外包团队:长年承接VR虚拟现实外包(应用、游戏、视频、漫游等)
北京动点飞扬软件,从事外包业务五年,长年承接全景VR视频,全景普通视频外包. 以下是全景VR视频案例(可操作,人不动景物不动,人移动,景物跟随) 欢迎联系我们QQ:372900288 TEL:1391 ...
- [原]JQuery mobile CSS 文件组织
从 JQuery mobile 1.4 开始, CSS 由3个部分组成,分别是 Icons.Theme和Structure jquery.mobile-1.4.x.css: 包括了 <标准图标 ...
- 扫描二维码自动识别手机系统(Android/IOS)
移动互联网发展迅速,各种APP的开发都会推出多个版本(多终端),比如:iPhone版.iPad版.Android版.有些APP还会考虑覆盖到多个国家(国际化),比如:中文版.英文版.日文版.韩文版等. ...
- 每天一个 Linux 命令(18):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- sysbench压力测试工具简介和使用(二)
sysbench压力测试工具使用: 2.1 测试数据库服务器的硬件配置信息如下: CPU: 24核心线程数,Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00G ...
- 【webpy开发实战】webpy的cookbook 个人版
版本:webpy0.3 问题1.1 所需软件及环境配置? 解决办法 sqlite: jinja2:找不到jinja2模块时,将jinja模块文件夹加入 sys.path -> sys.path ...
- C#创建DBF自由库 [转]
先看段代码: string ole_connstring = @"Provider=VFPOLEDB.1;Data Source=D:\;";System.Data.OleDb.O ...
- ios 逆向收录
lldb 远程调试环境搭建:http://www.cnblogs.com/csutanyu/p/3653252.html
- jquery的blur之后,focus获取不到焦点的解决办法
一:很多童鞋可能会遇到这种情况: jquery的blur之后,focus获取不到焦点. 二:使用场景: 用户填写信息的时候,若邮箱为空,则提示 请填写邮箱,并将光标置于填写邮箱的文本框里,方便用户的再 ...
- BAE log服务的配置(nodejs)
log4js.loadAppender('baev3-log'); var options = { 'user': appConfig.AK, //这里是在用户的安全认证中的Access Key ID ...