『ice 离散化广搜』
<更新提示>
<第一次更新>
<正文>
ice(USACO)
Description
Bessie 在一个冰封的湖面上游泳,湖面可以表示为二维的平面,坐标范围是-1,000,000,000..1,000,000,000。
湖面上的N(1 <= N <= 20,000)个位置有石块(编号分别为1到N),其它位置是冰面。
由于Bessie滑冰技术不够好,她通过推动自己旁边的石块,依靠反作用力向某一个方向前进,在碰到一个新的石块之前,Bessie是不会停下来的。(当然,最后会停留在某块石块的前一个格子里)由于Bessie无法计算复杂的角度,她只能够向东南西北四个方向前进。
很显然,Bessie不能够穿越石块,因此,Bessie仅仅可以向三个方向滑。
滑冰不是没有风险,Bessie滑向某个方向后必须能碰到某个石块,因此她必须很小心。
考虑下面的一个情况,Bessie希望到达在她东面的目标位置(x=5,y=1),(. = 冰块,* = 石头, B = Bessie, G = 目的位置)如果她直接向东滑,那么她会滑过目标位置,因为她通过撞上某块石头来停下来,一个能够到达目标位置的方案是这样的:
(a) (b) (c) (d)
4 .....*. .....*. .....*. .....*.
3 ..*.... slide ..*.... slide ..*.... slide ..*....
2 ......* north ..B...* east .....B* south ......*
1 .*B..G. ------> .*...G. ------> .*...G. ------> .*...B.
0 *....*. *....*. *....*. *....*.
在(a)中,Bessie 只能朝向北,东,或者南三个方向,但是只有在北面能撞上石头从而停下来,在(b)中,类似地,她只能向东走。
对于输入,石头 i位于坐标为X_i,Y_i的位置,(-1,000,000,000<= X_i <= 1,000,000,000; -1,000,000,000 <= Y_i <= 1,000,000,000),没有任何两块石头位于同一个位置,Bessie从Bx,By的位置出发(出发点一定与某个石头相邻),Bessie的目标位置是Gx,Gy(-1,000,000,000 <= Gx <= 1,000,000,000; -1,000,000,000 <= Gy <=1,000,000,000).
Bessie 并不介意长时间滑冰,但是,不停地推石头依靠反作用力前进很累。FJ 非常关心Bessie的健康,因此他希望知道Bessie最少要推多少次石头才能到达终点。
Input Format
第一行: 五个用空格隔开的整数: N, Bx, By, Gx, and Gy
第二行到第N+1行: 第i+1行用两个空格隔开的整数来描述第i个石头
Output Format
- 第一行: 一个整数表示Bessie至少要推多少次石头才能够到达终点
Sample Input
6 2 1 5 1
5 4
2 3
1 1
6 2
5 0
0 0
Sample Output
3
解析
简单地来看的话,这道题显然是一个广搜,每一个状态之间的转移的花费都是\(1\)。
但是问题就是这个"地图"太稀疏了,石头个数只有\(20000\),而坐标却全是\(int\)范围内的,需要考虑离散化一下。
二维离散化?这样太复杂了些,最好的办法是利用\(STL\)。我们利用\(map\)和\(set\)建立形如map< int,set<int> >这样的一对多的索引数组。对于每一行,我们存下行内所有石头的纵坐标,对于每一列,我们也存下列内所有石头的横坐标。然后对于每一个位置我们就能广搜了。利用\(set\)自带的二分查找函数方便地找到第一个碰撞到的石头,然后就能得到下一个状态了。
当然,记录当前状态的最小花费的数组也是用\(map\)的。
\(Code:\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define mset(name,val) memset(name,val,sizeof name)
#define filein(str) freopen(str".in","r",stdin)
#define fileout(str) freopen(str".out","w",stdout)
#define node pair<int,int>
#define x first
#define y second
const int N=20020;
int n;
node Begin,End;
map < node,int > dis;
map < int,set < int > > row,col;
inline void input(void)
{
scanf("%d%d%d%d%d",&n,&Begin.x,&Begin.y,&End.x,&End.y);
for(int i=1;i<=n;i++)
{
node t;
scanf("%d%d",&t.x,&t.y);
row[t.x].insert(t.y);col[t.y].insert(t.x);
}
}
inline node findup(node temp)
{
set < int > s=col[temp.y];
set < int > :: iterator it=s.lower_bound(temp.x);
if(it==s.begin()||temp.x-(*(--it))<=1)
return temp;
return (node){(*it)+1,temp.y};
}
inline node finddown(node temp)
{
set < int > s=col[temp.y];
set < int > :: iterator it=s.upper_bound(temp.x);
if(it==s.end()||(*it)-temp.x<=1)
return temp;
return (node){(*it)-1,temp.y};
}
inline node findright(node temp)
{
set < int > s=row[temp.x];
set < int > :: iterator it=s.upper_bound(temp.y);
if(it==s.end()||(*it)-temp.y<=1)
return temp;
return (node){temp.x,(*it)-1};
}
inline node findleft(node temp)
{
set < int > s=row[temp.x];
set < int > :: iterator it=s.lower_bound(temp.y);
if(it==s.begin()||temp.y-(*(--it))<=1)
return temp;
return (node){temp.x,(*it)+1};
}
inline void bfs(void)
{
queue < node > q;
q.push(Begin);
dis[Begin]=0;
while(!q.empty())
{
node temp=q.front();q.pop();
if(temp==End)break;
node next=findup(temp);
if(next!=temp&&!dis[next])
{
dis[next]=dis[temp]+1;
q.push(next);
}
next=finddown(temp);
if(next!=temp&&!dis[next])
{
dis[next]=dis[temp]+1;
q.push(next);
}
next=findleft(temp);
if(next!=temp&&!dis[next])
{
dis[next]=dis[temp]+1;
q.push(next);
}
next=findright(temp);
if(next!=temp&&!dis[next])
{
dis[next]=dis[temp]+1;
q.push(next);
}
}
}
int main(void)
{
filein("ice.");
fileout("ice.");
input();
bfs();
printf("%d\n",dis[End]);
return 0;
}
<后记>
『ice 离散化广搜』的更多相关文章
- HDU--杭电--1195--Open the Lock--深搜--都用双向广搜,弱爆了,看题了没?语文没过关吧?暴力深搜难道我会害羞?
这个题我看了,都是推荐的神马双向广搜,难道这个深搜你们都木有发现?还是特意留个机会给我装逼? Open the Lock Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5652(二分+广搜)
题目链接:http://acm.hust.edu.cn/vjudge/contest/128683#problem/E 题目大意:给定一只含有0和1的地图,0代表可以走的格子,1代表不能走的格 子.之 ...
- nyoj 613 免费馅饼 广搜
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- poj 3278:Catch That Cow(简单一维广搜)
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 45648 Accepted: 14310 ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- 广搜+打表 POJ 1426 Find The Multiple
POJ 1426 Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 25734 Ac ...
- 双向广搜 codevs 3060 抓住那头奶牛
codevs 3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛 ...
- 双向广搜+hash+康托展开 codevs 1225 八数码难题
codevs 1225 八数码难题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Yours和zero在研究A*启 ...
随机推荐
- 数组中的第K个最大元素leetcode(Top K的问题)
在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...
- gitlab使用过程中的需求与解决
序言 在git使用过程中发现指令实在太多,就算记忆后不长用的话很快也会忘记掉,所以编写本文的初衷是为了记录在使用git指令的过程中所遇到的需求与解决方法,毕竟使用git的需求也就那么一些,范围不大,所 ...
- flask权限控制
大概思路为通过管理员id的查询角色,然后查看相应权限,为列表类型,然后通过id查询对应的路由规则,进而得出结论得出是否具有该权限 具体代码: def admin_auth(f): @wraps(f) ...
- ISP PIPLINE (九_1) Denoise 之 space domain denoise
1.空间域噪声类型 1.gauss+possion 2.椒盐噪声(dpc处理已经处理了) 去除空域噪声有哪些方法? 空域噪声一般的思想是对某pixel邻域的pixels进行加权平均. 比如 1.高斯降 ...
- 创建线程的一般方式和匿名内部类方式对比——继承thread类,重写run()方法
第一种:继承thread类,重写run()方法 一般方式:Demo01.java /** * 创建线程的第一种方式:继承thread类,重写run()方法 * * @author :liuqi * @ ...
- FoxMail邮件设置
最近部门变动,要求所有的沟通及交流都需要用企业邮箱,对于一般不喜欢看邮箱的我,经常会错过很多邮件.为了统一接收企业邮件及个人邮件,开始使用Foxmail(以前不喜欢整这些东西).下面分享一下FoxMa ...
- Spring系列__01HelloWorld
Spring作为一款成熟的Java框架,其优点和意义不用我多说,可以参考:https://m.w3cschool.cn/wkspring/pesy1icl.html 今天开始写一下Spring家族的总 ...
- Network Security final project---War Game
项目介绍: 为自己的网段设置防火墙并尝试攻击其他组 网络结构: 每组有3个机器,包含一个gateway和两个workstation,其中gateway是可以连接到其他组的gateway,但是无法连接到 ...
- CP343-1 扩展ProfibusCPU 314C-2DP
1. MPI编程电缆连接PLC ,设置接口为PC Adapter MPI.1,如下图所示 2. 硬件组态插入组态,建立ethernet 网络,编译后下载 3.CP343-1安装上后,CPU run不起 ...
- 动态设置bootstrapswitch状态
checkbox的html <input type="checkbox" name="mySwitch" id="mySwitch"& ...