Description

在一个8行9列的国际象棋棋盘上,有一名骑士在追杀对方的国王。该骑士每秒跨越一个2*3的区域,如下图所示。

而对方的国王慌忙落逃,他先沿着右下斜线方向一直跑,遇到边界以后会沿着光线反射方向继续跑(遇到死角则原路返回),他每秒只跑一格。

给出骑士和国王的初始位置,求最快在多少秒的时候骑士能追杀掉对方的国王。骑士和国王每一秒都必须要有行动,而不能原地等待。

Input

有多组测试数据。对于每组测试数据,输入只有一行:nx,ny,kx,ky,前2个表示骑士的初始坐标,后2个表示国王的初始坐标,以左上角的格子为(0,0),向右为x轴正方向,向下为y轴正方向。(0<=nx,kx<=8,0<=ny,ky<=7)

Output

对于每组测试数据,仅输出一个整数,即骑士追杀到国王的最快时刻。初始位置的时刻为0。追杀到的时刻是指骑士和国王处在同一格的时刻。

Sample Input

0 7 0 0

Sample Output

3
和正常的bfs不同,一个静点,一个动点,这个两个都是动点,求交汇处所需的最小步数,一个要注意移动的规则,还有就是重复走过的点,避免死循环。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int dirp[][]={{,},{-,},{-,},{-,-},{-,-},{,-},{,-},{,}};
int dirk[][]={{,-},{-,-},{-,},{,}};
int xp,yp,xk,yk;
int turn[][][][][];
struct Node
{
int px;
int py;
int kx;
int ky;
int step;
}ans,pos;
Node trans(Node a,int x)
{
int x1,x2,y1,y2,k;
int nx1,nx2,ny1,ny2,nk;
x1=a.px;y1=a.py;x2=a.kx;y2=a.ky;k=a.step;
nx1=x1+dirp[x][];
ny1=y1+dirp[x][];
if(nx1< || ny1< || nx1> || ny1>) {a.step=-;return a;}
if(x2== && y2== && k==) nx2=,ny2=,nk=;
else if(x2== && y2== && k==) nx2=,ny2=,nk=;
else if(x2== && y2== && k==) nx2=,ny2=,nk=;
else if(x2== && y2== && k==) nx2=,ny2=,nk=;
else if(x2== && (k== || k==))
{
nx2=;
if(k==) ny2=y2-,nk=;
else ny2=y2+,nk=;
}
else if(x2== && (k== || k==))
{
nx2=;
if(k==) ny2=y2-,nk=;
else ny2=y2+,nk=;
}
else if(y2== && (k== || k==))
{
ny2=;
if(k==) nx2=x2+,nk=;
else nx2=x2-,nk=;
}
else if(y2== && (k== || k==))
{
ny2=;
if(k==) nx2=x2-,nk=;
else nx2=x2+,nk=;
}
else nx2=x2+dirk[k][],ny2=y2+dirk[k][],nk=k;
if(turn[nx1][ny1][nx2][ny2][nk]!=-) {a.step=-;return a;}//说明此情况已出现过无解,死循环。
turn[nx1][ny1][nx2][ny2][nk]=turn[x1][y1][x2][y2][k]+;
a.px=nx1;a.py=ny1;a.kx=nx2;a.ky=ny2;a.step=nk;
return a;
}
void bfs(int x1,int y1,int x2,int y2)
{
queue<Node>q;
int cnt=;
memset(turn,-,sizeof(turn));
ans.px=x1;ans.py=y1;ans.kx=x2;ans.ky=y2;ans.step=;
turn[x1][y1][x2][y2][]=;
q.push(ans);
while(!q.empty())
{
pos=q.front();
q.pop();
if(pos.px==pos.kx && pos.py==pos.ky)
{
cnt=turn[pos.px][pos.py][pos.kx][pos.ky][pos.step];
break;
}
for(int i=;i<;i++)
{
ans=trans(pos,i);
if(ans.step>=) q.push(ans);
}
}
printf("%d\n",cnt);
}
int main()
{
while(scanf("%d%d%d%d",&xp,&yp,&xk,&yk)!=EOF)
{
bfs(xp,yp,xk,yk);
}
return ;
}

CSU 1046 追杀的更多相关文章

  1. Flex 1046: 找不到类型,或者它不是编译时常数;1180: 调用的方法 CompPropInfo 可能未定义

    导入项目之后一直报这个错误, 1046: 找不到类型,或者它不是编译时常数: 1180: 调用的方法 CompPropInfo 可能未定义 想这应该是没有把当前这个类编译进项目当中,找了半天也没有找到 ...

  2. BZOJ 1046 最长不降子序列(nlogn)

    nlogn的做法就是记录了在这之前每个长度的序列的最后一项的位置,这个位置是该长度下最后一个数最小的位置.显然能够达到最优. BZOJ 1046中里要按照字典序输出序列,按照坐标的字典序,那么我萌可以 ...

  3. csu 1812: 三角形和矩形 凸包

    传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...

  4. 洛谷 1016 / codevs 1046 旅行家的预算

    https://www.luogu.org/problem/show?pid=1016 http://codevs.cn/problem/1046/ 题目描述 Description 一个旅行家想驾驶 ...

  5. CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...

  6. CSU 1120 病毒(DP)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 解题报告:dp,用一个串去更新另一个串,递推方程是: if(b[i] > a ...

  7. CSU 1116 Kingdoms(枚举最小生成树)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1116 解题报告:一个国家有n个城市,有m条路可以修,修每条路要一定的金币,现在这个国家只 ...

  8. CSU 1113 Updating a Dictionary(map容器应用)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1113 解题报告:输入两个字符串,第一个是原来的字典,第二个是新字典,字典中的元素的格式为 ...

  9. CSU 1333 Funny Car Racing (最短路)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1333 解题报告:一个图里面有n个点和m条单向边,注意是单向边,然后每条路开a秒关闭b秒 ...

随机推荐

  1. Ambari Confirm Hosts Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

    Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).解决 Permanently added 'hdp21,192. ...

  2. [POI2002][HAOI2007]反素数 数论 搜索 好题

    题目描述: 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4, ...

  3. [译] 我最终是怎么玩转了 Vue 的作用域插槽

    原文链接:https://juejin.im/post/5c8856e6e51d456b30397f31#comment 原文地址:How I finally got my head around S ...

  4. poj2728 Desert King(最小生成树+01分数规划=最优比率生成树)

    题意 n个点完全图,每个边有两个权值,求分数规划要求的东西的最小值. (n<=1000) 题解 心态炸了. 堆优化primT了. 普通的就过了. 我再也不写prim了!!!! 咳咳 最优比率生成 ...

  5. python描述符和属性查找

    python描述符 定义 一般说来,描述符是一种访问对象属性时候的绑定行为,如果这个对象属性定义了__get__(),__set__(), and __delete__()一种或者几种,那么就称之为描 ...

  6. HDU 4917 Permutation 拓扑排序的计数

    题意: 一个有n个数的排列,给你一些位置上数字的大小关系.求合法的排列有多少种. 思路: 数字的大小关系可以看做是一条有向边,这样以每个位置当点,就可以把整个排列当做一张有向图.而且题目保证有解,所以 ...

  7. 恐怖的奴隶主(bob)

    题目 试题3:恐怖的奴隶主(bob) 源代码:bob.cpp 输入文件:bob.in 输出文件:bob.out 时间限制:1s 空间限制:512MB 题目描述 小L热衷于undercards. 在un ...

  8. Linux学习总结(9)——Linux 新手必知必会的 10 条 Linux 基本命令

    Linux 对我们的生活产生了巨大的冲击.至少你的安卓手机使用的就是 Linux 核心.尽管如此,在第一次开始使用 Linux 时你还是会感到难以下手.因为在 Linux 中,通常需要使用终端命令来取 ...

  9. c3p0出现 An attempt by a client to checkout a Connection has timed out

    java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. at com.mchange ...

  10. 【v2.x OGE教程 17】事务处理

    游戏代码中常常有些逻辑须要处理.因此OGE引擎加入了一个IUpdateHandler的类. IUpdateHandler类是OGE引擎中使用频率很之高的组件之中的一个,其本身是一个接口.内部有onUp ...