{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$个数,描述迷宫.最后一行一 ...
随机推荐
- js,addEventListener参数传递
解决方法 因为i相对匿名函数是外面的变量,就把循环绑定的时候,将i的值传入到匿名函数内,就可以了.因此需要在匿名函数(事件函数)外包裹一个匿名函数, 并立即执行. var elems = docume ...
- opencart在空间中安装出错,连接不上mysql
客户要求,要在国外某空间安装opencart.话说opencart根本没怎么搞过,也不太清楚,php也是半吊子,临时看了几天,硬着头皮上把. 出错,安装进行到数据库连接设置的时候,死活连接不上,开始以 ...
- sqlserver添加表、字段注释
引用 :http://begoodluck.blog.163.com/blog/static/20450728020141191412788/ 1.sqlserver用语句给表注释EXECUTE sp ...
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
- SQLServer2005删除log文件和清空日志的方案
数据库在使用过程中会使日志文件不断增加,使得数据库的性能下降,并且占用大量的磁盘空间.SQL Server数据库都有log文件,log文件记录用户对数据库修改的操作.可以通过直接删除log文件和清空日 ...
- Struts2中Action由自己与由Spring管理的区别
struts2单独使用时action由struts2自己负责创建:与spring集成时,action实例由spring负责创建. 这导致在两种情况下struts.xml配置文件的略微差异. 假如: ...
- GDB 调试 一些命令
1. gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式 x/ (n,f,u为可选参数)n: 需要显示的内存单元个数,也就是从 ...
- shell条件判断中-a至-z的含义
[ -a file ] ------- 如果file存在,返回值为真. [ -b file ] ------- 如果file存在且为块特殊文件,返回值为真. [ -c file ] ------- 如 ...
- JavaScript的学习2
1. a.字符串运算符 符号 功能 + 字符串连接 += 将左边的值加上右边的值然后再赋值给左边的变量 b.比较运算符 运算符 含义 说明 > 大于 M>N,当M大于N时,返回TRUE ...
- Git——2
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...