{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$个数,描述迷宫.最后一行一 ...
随机推荐
- protobuf C++ 使用示例
1.在.proto文件中定义消息格式 2.使用protobuf编译器 3.使用c++ api来读写消息 0.为何使用protobuf? 1.原始内存数据结构,可以以二进制方式sent/saved.这种 ...
- SparkConf加载与SparkContext创建(源码阅读四)
sparkContext创建还没完呢,紧接着前两天,我们继续探索..作死... 紧接着前几天我们继续SparkContext的创建: 接下来从这里我们可以看到,spark开始加载hadoop的配置信息 ...
- android 对sqlite数据库的增删改查等各种操作
转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...
- Google protobuf proto文件编写规则
转载自: http://blog.csdn.net/yi_ya/article/details/40404231 1. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中 ...
- [C#对Oracle操作]C#操作调用Orcale存储过程有参数
/// <summary> /// 获取ERP固定资产计提数据 /// </summary> /// <param name="strCompanyCode&q ...
- 25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation
本文总结了使用Selenium Web driver 做页面自动化测试的一些 tips, tricks, snippets. 1. Chrome Driver 如何安装 extensions 两种方式 ...
- AFNnetworking详解
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...
- 如何保护.net中的dll文件(防破解、反编译)
如何保护.net中的dll文件(防破解.反编译) 2010-07-19 15:08 [小 大] 来源: 赛迪网 评论: 0 分享至: 百度权重查询 词库网 网站监控 服务器监控 SEO监控 ...
- cocos2d-x:懒人数学函数
做游戏开发,要用到比较多的数学计算,对于程序员来说,还是用一种懒一点的方法,cocos2d-x方便开发者投机取巧...提供了很多方便的的数学函数,方便我们的数学计算.以下是在网上收集到的一些常用的数学 ...
- python 核心编程课后练习(chapter 6)
6-1 #6-1 #help(string) import string str = "helloworld" substr = "h1e" if string ...