一道神奇的BFS

前置芝士

  1. BFS(DFS):这次真的不是我懒,我也不知道DFS怎么写.
  2. STL中的set或者map.

具体做法

数据范围非常大,直接BFS肯定是一片黑色(指TLE,MLE),直接贪心又有可能会出一些莫名其妙的问题,所以,大范围贪心,小范围BFS的思路就出现了(不要问我是怎么出现的).



如这样一张图,要从红点到蓝点,可以先顺着橙色点的路径到绿色的框中(框的大小和形状可以自由调整),到框中以后就可以BFS了,BFS时坐标很大,所以可以用map(set)来判断这个点是否走过.

代码

#include<bits/stdc++.h>
#define rap(i,first,last) for(int i=first;i<=last;++i)
using namespace std;
const int maxN=500;
const int move_x[9]={233,1,1,-1,-1,2,2,-2,-2};
const int move_y[9]={233,2,-2,2,-2,1,-1,1,-1};
map<pair<int,int>,int>visit;//
int fx,fy,lx,ly;
int dis(int x,int y,int x1,int y1)//我比较喜欢正方形
{
return max(abs(x-x1),abs(y-y1));
}
struct Que//定义一个结构体
{
int x,y,sp;
}que[maxN*maxN];
void write(int answer)//输出answer
{
printf("%d",answer);
exit(0);
}
int main()
{
scanf("%d%d%d%d",&fx,&fy,&lx,&ly);
lx=abs(fx-lx);//将这两个点的位置更改一下,但相对位置不变,方便处理
ly=abs(fy-ly);
fx=0;
fy=0;
int answer=0;
while(dis(fx,fy,lx,ly)>=100)//在BFS的范围外贪心
{
if(abs(lx-fx)>abs(ly-fy))
{
if(lx>fx)
fx+=2;
else
fx-=2;
if(ly>fy)
fy++;
else
fy--;
}
else
{
if(lx>fx)
fx++;
else
fx--;
if(ly>fy)
fy+=2;
else
fy-=2;
}
answer++;
}
que[1].x=fx;
que[1].y=fy;
que[1].sp=0;
visit[make_pair(fx,fy)]=1;//visit去重
int head=0,tail=1;
while(++head<=tail)//BFS的部分
{
if(que[head].x==lx&&que[head].y==ly)write(que[head].sp+answer);//到终点就输出answer
rap(i,1,8)
if(dis(lx,ly,que[head].x+move_x[i],que[head].y+move_y[i])<=100)//注意不能超出范围
if(!visit[make_pair(que[head].x+move_x[i],que[head].y+move_y[i])])//如果没有走过就走
{
que[++tail].x=que[head].x+move_x[i];
que[tail].y=que[head].y+move_y[i];
que[tail].sp=que[head].sp+1;
visit[make_pair(que[tail].x,que[tail].y)]=1;
}
}
return 0;
}

「Luogu P2060 [HNOI2006]马步距离」的更多相关文章

  1. P2060 [HNOI2006]马步距离

    P2060 [HNOI2006]马步距离 数据到百万级别,明显爆搜不行,剪枝也没法剪.先打表.发现小数据内步数比较受位置关系影响,但数据一大就不影响了.大概搜了一个20*20的表把赋值语句打出来.判断 ...

  2. bzoj1193: [HNOI2006]马步距离

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MB Description 在国际象棋和中国象棋中,马的移动规则相同,都是走&q ...

  3. 1193: [HNOI2006]马步距离

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2027  Solved: 915[Submit][Statu ...

  4. [BZOJ1193][HNOI2006]马步距离 大范围贪心小范围爆搜

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1988  Solved: 905[Submit][Statu ...

  5. 【bzoj1193】[HNOI2006]马步距离

    [HNOI2006]马步距离 Description Input 只包含4个整数,它们彼此用空格隔开,分别为xp,yp,xs,ys.并且它们的都小于10000000. Output 含一个整数,表示从 ...

  6. bzoj1193: [HNOI2006]马步距离(贪心+bfs)

    1193: [HNOI2006]马步距离 题目:传送门 题解: 毒瘤题... 模拟赛时的一道题,刚开始以为是一道大难题...一直在拼命找规律 结果.... 还是说正解吧: 暴力的解法肯定是直接bfs, ...

  7. BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193 题意: 给定起点(px,py).终点(sx,sy).(x,y < 100000 ...

  8. [HNOI2006]马步距离

    嘟嘟嘟 这题首先直接bfs可定过不了,因此可以先贪心缩小两个点的距离,直到达到某一个较小的范围(我用的是30),再bfs暴力求解. 首先我们求出这两个点的相对距离x, y,这样就相当于从(x, y) ...

  9. [BZOJ1193][HNOI2006]马步距离(贪心+dfs)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1193 分析: 首先小范围可以直接暴力.(其实只要用上题目中的表就行了) 如果范围比较大 ...

随机推荐

  1. python两个_多个字典合并相加

    这只是符合比较正常的需求和场景. #一.适用合并两个字典(key不能相同否则会被覆盖),简单,好用. A = {'a': 11, 'b': 22} B = {'c': 48, 'd': 13} #up ...

  2. 10.Redis的RDB和AOF两种持久化机制的优劣势对比

    1.RDB和AOF两种持久化机制的介绍 2.RDB持久化机制的优点3.RDB持久化机制的缺点4.AOF持久化机制的优点5.AOF持久化机制的缺点6.RDB和AOF到底该如何选择 我们已经知道对于一个企 ...

  3. python-opencv:读取图片

    代码 import cv2 # 读取一张图片 src = cv2.imread("../images/lena.jpg") # 命名一个窗口 cv2.namedWindow(&qu ...

  4. Centos5.5+LAMP环境

    Note:如果网络正常,apache服务正常,仍然不能访问网页.需要检查linux 防火墙是否关闭. ( 先重新启动防火墙 service iptables start 然后输入配置防火墙的命令并查看 ...

  5. RADIUS Authentication with WPA2-Enterprise

    概观具有802.1X身份验证的WPA2-Enterprise可用于对域中的用户或计算机进行身份验证.请求方supplicant(无线客户端)使用RADIUS服务器上配置的EAP方法对RADIUS服务器 ...

  6. 关闭AnyConnect登录安全警告窗口

    一.问题描述:使用AnyConnect client连接时,如何关闭的安全警告窗口? 二.原因分析:   AnyConnect Server(ASA)和AnyConect client(PC)上没有受 ...

  7. Python中的代码块及其缓存机制、深浅copy

    一.代码块及其缓存机制 代码块 一个模块.一个函数.一个类.一个文件等都是一个代码块:交互式命令下,一行就是一个代码块. 同一个代码块内的缓存机制(字符串驻留机制) 机制内容:Python在执行同一个 ...

  8. 图书商城(基于Jsp+Servlet)

    这个项目主要是加深一下对于servlet和jsp知识相关的了解以及简单业务逻辑的处理. 用户更新的逻辑: 1.点击修改用户的那一行可以获取到用户的id 2.跳转到一个servlet,去查询该用户的基本 ...

  9. 「JSOI2011」分特产

    「JSOI2011」分特产 传送门 计数题. 考虑容斥掉每人至少一个的限制. 就直接枚举至少有多少人没有分到特产,然后剩下的随便分. \[Ans = \sum_{i = 0}^n (-1)^i {n ...

  10. 概念 - 抖脚(Fidgeting)

    参考 https://cn.nytimes.com/health/20161220/why-fidgeting-is-good-medicine/dual/ https://baike.baidu.c ...