题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1193

题意:

  给定起点(px,py)、终点(sx,sy)。(x,y < 10000000)

  每一步只能走“日”字(象棋中的马走日),坐标可以为负。

  问你从起点到终点最少走多少步。

题解:

  简化问题:

    (1)从(px,py)到(sx,sy)等价于:从(abs(px-sx), abs(py-sy))到(0,0)。

    (2)从(x,y)到(0,0)等价于:从(y,x)到(0,0)。

    所以原题简化成:从(abs(px-sx), abs(py-sy))到(0,0),并且可以随时交换x,y以保证x > y。

  大范围贪心:

    为了方便起见,始终保证x > y。

    那么对于任意一个数据的最短路径都可以等价为如下形式:

    

    左边部分直走(先右下,再右上),右边部分往右上方走,直到接近终点时停止贪心(x+y <= 50)。

    同时为了保证没有过多的直走(直走会浪费2个距离),设定直走的前提为:

      右边区域的长宽x,y满足:((x-4)/y) > 2

      也就是:x-4 > y*2

    每直走一次,ans+=2。往右上走一次,ans++。

  小范围暴搜:

    bfs.

    很好写,不说了。。。

    注意:为了不偏离终点太远,限定可继续搜索的点要满足:abs(nx)<=100 && abs(ny)<=100

AC Code:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#define MAX_R 105 using namespace std; const int dx[]={,,,,-,-,-,-};
const int dy[]={,,-,-,,,-,-}; struct Coor
{
int x;
int y;
Coor(int _x,int _y)
{
x=_x;
y=_y;
}
Coor(){}
}; int x,y;
int px,py;
int sx,sy;
int ans=;
int dis[MAX_R][MAX_R];
bool vis[MAX_R][MAX_R];
queue<Coor> q; void read()
{
cin>>px>>py>>sx>>sy;
x=abs(px-sx);
y=abs(py-sy);
} Coor get_front()
{
Coor now=q.front();
q.pop();
return now;
} void insert(Coor now)
{
if(vis[now.x][now.y]) return;
q.push(now);
vis[now.x][now.y]=true;
} void bfs()
{
memset(dis,-,sizeof(dis));
dis[x][y]=;
insert(Coor(x,y));
while(!q.empty())
{
Coor now=get_front();
int nx=now.x;
int ny=now.y;
if(nx== && ny==) return;
if(abs(nx)> || abs(ny)>) continue;
for(int i=;i<;i++)
{
int tx=nx+dx[i];
int ty=ny+dy[i];
if(dis[tx][ty]==-)
{
dis[tx][ty]=dis[nx][ny]+;
insert(Coor(tx,ty));
}
}
}
} void solve()
{
while(x+y>)
{
if(x<y) swap(x,y);
if(x->y*)
{
x-=;
ans+=;
}
else
{
x-=;
y--;
ans++;
}
}
bfs();
ans+=dis[][];
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}

BZOJ 1193 [HNOI2006]马步距离:大范围贪心 小范围暴搜的更多相关文章

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

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

  2. 1193: [HNOI2006]马步距离

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

  3. bzoj1193: [HNOI2006]马步距离

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

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

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

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

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

  6. P2060 [HNOI2006]马步距离

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

  7. 「Luogu P2060 [HNOI2006]马步距离」

    一道神奇的BFS 前置芝士 BFS(DFS):这次真的不是我懒,我也不知道DFS怎么写. STL中的set或者map. 具体做法 数据范围非常大,直接BFS肯定是一片黑色(指TLE,MLE),直接贪心 ...

  8. 【BZOJ 1193】 [HNOI2006]马步距离

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 原问题可以等价为两个点. 然后其中一个点要移动到另外一个点. 那么我们可以把左下角那个点(对称总是可以得到一个点在左下角)放在原点的 ...

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

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

随机推荐

  1. 2.配置通过数据库接收SaltStack批量管理日志

    2.配置通过数据库接收SaltStack批量管理日志 2016-07-04 10:02:52来源:oschina作者:eddy_linux人点击     默认情况下发送给salt minion的命令执 ...

  2. 谈论程序中的token

    -> //指针,一旦符号分开就会成以下两个意思,我们一定要注意符号 - //减号 > //大与 int a,big; if(x>big) big = x; C语言以及一些其它语言会自 ...

  3. vue2.0 仿手机新闻站(六)详情页制作

    1.结构 2.配置详情页路由 router.config.js /** * 配置 路由 */ // 导入组件 import Home from './components/Home.vue' impo ...

  4. C++中全局变量如何使用

    运行文件的小技巧:包含2个.CPP和一个.H文件,必须一个.CPP一个.H一一对应.且C++中,只能运行一个项目,要想在多个文件中(.cpp)运行一个.cpp必须建立多个项目,或者将不允许运行的文件从 ...

  5. HDU 3416

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. hdu 2814 Interesting Fibonacci

    pid=2814">点击此处就可以传送 hdu 2814 题目大意:就是给你两个函数,一个是F(n) = F(n-1) + F(n-2), F(0) = 0, F(1) = 1; 还有 ...

  7. versions 忽略 xcuserdata 目录

    1.打开versions,选中xcuserdata目录 2.菜单条.Action->ignore "..." 3.versions不再显示不同

  8. cmake学习之- set

    最后更新: 2019-06-06 一.简单介绍 set 和 unset 为一对相反的指令,分别为设置变量以及取消设置变量. 什么是变量? 变量就是用于保存值的存储单元. set 有哪几种? set 有 ...

  9. android中使用百度定位sdk实时的计算移动距离

    ;   //5秒刷新一次 private Handler refreshHandler = new Handler(){ //刷新界面的Handler public void handleMessag ...

  10. springmvc结合base64存取图片到mysql

    简单介绍: 1.jsp通过MultipartFile上传图片到后台 2.后台把上传的图片通过base64转换成字符串存到mysql 3.从mysql读取图片字符串,通过base64反转成byte数组, ...