F: Horse Pro 马走棋盘 BFS

F: Horse Pro

豆豆也已经开始学着玩象棋了,现在豆豆已经搞清楚马的走法了,但是豆豆不能确定能否在 100

步以内从一个点到达另一个点(假设棋盘无限大)。

Input

第一行输入两个整数 x1,y1

表示当前马所在的位置。

第二行输入两个整数 x2,y2

表示豆豆想把马走在的位置。

−10000≤x1,x2,y1,y2≤10000

Output

如果能够在100步以内(包括100步)从(x1,y1)

到达 (x2,y2) 则输出到达所需要的最小步数,否则输出 −1

Sample Input

1 1
2 3

Sample Output

1
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<map>
#include<queue>
#include<utility>
#define ll long long
using namespace std;
int dir[8][2] = {1, 2, 2, 1, 1, -2, 2, -1, -1, 2, -2, 1, -1, -2, -2, -1};
int sx,sy,ex,ey;
struct node
{
    int x;
    int y;
    int dep;
};
map<pair<int,int>,int>m;//标记点是否走过,因为坐标有负数,不能用数组
/*
一开始是想用结构体的,map<node,int>m会编译报错,因为map是内部有序的
如果使用结构体的话,应该先重在小于号 > 使结构体保持有序
*/
int bfs()
{
    queue<node>p;
    node temp;
    temp.x=sx;
    temp.y=sy;
    temp.dep=0;
    p.push(temp);
    while(!p.empty())
    {
        node now=p.front();
        p.pop();
        if(now.dep>100)
            return -1;
        if(now.x==ex&&now.y==ey)
            return now.dep;
        for(int i=0;i<8;i++)
        {
            node tmp=now;
            tmp.x=tmp.x+dir[i][0];
            tmp.y=tmp.y+dir[i][1];
            pair<int,int>d=make_pair(tmp.x,tmp.y);
            if(m[d])//标记点
                continue;
            m[d]=1;
            tmp.dep++;
            p.push(tmp);
        }

    }
}
int main()
{
    cin>>sx>>sy>>ex>>ey;
    int ans=bfs();
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/-citywall123/p/11930825.html

时间: 2024-10-28 21:23:34

F: Horse Pro 马走棋盘 BFS的相关文章

剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)

题目描述  请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子. 例如: a   b  c   e s   f   c   s  a  d   e   e  矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后

马踏棋盘代码分析

(因为最近数据结构讲到图和网,听是能听懂,可是一到代码上,就发现问题很多,因此将马踏棋盘的代码拿出来分析下,貌似有些不对头,其实呢是因为不想写其余的作业,所以找个借口) 说到马踏棋盘,这样说,就是一个8*8的棋盘,指定一个位置,让马走日字,将棋盘上的点全部走完. 先说说思路:首先指定位置,在这个位置的基础上走一个位置,然后再在这个基础上走日字,现在面临一个问题,要是走着走着,突然有一次,就那么的卡住在那里了,怎么走都不行,可是全局看下,会发现,还有空点没有踏到,那么怎么办?看来这条路不通了,那就

马踏棋盘问题-贪心(matlab&amp;c++)

1.问题描述 将马随机放在国际象棋的Board[0-7][0-7]的某个方格中,马按走棋规则进行移动,走遍棋盘上全部64个方格.编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之. 2.matlab代码 clear all clc chessboard=zeros(8);%初始化 DirX=[2 1 -1 -2 -2 -1 1 2];%方向向量 DirY=[1 2 2 1 -1 -2 -2 -1]; stack(1).x=0; stack

一本通1219 马走日

[题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第一行为整数T(T < 10),表示测试数据组数. 每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y.(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10). [输出] 每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次

Knight&#39;s Trip---hdu3766(马走日求最小走的步数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3766 给你一个x ,y 求出从(0,0)位置到达需要的最小步数每次只能走日型: 下图为暴力bfs得到的答案:可以看一下: /** 首先,xy的大小排序和转化为都是正数步数不变应该懂吧. y=2*x这种情况直接就是(x+y)/3步. 如果y<2*x但是(x+y)%3==0的话,那么我们可以通过控制(1,2),(2,1) 两种跳法的次数达到...总数必然是(x+y)/3,然后xy的和对3取余是1的话,

马踏棋盘的c语言实现(一.遍历法)

题目很简单呀!!! 在国际象棋的棋盘上,将马随意放置,之后走日字,走完即可. 要求:8×8的棋盘 遍历算法: 可以说是碰运气,当你确定在某一位置时,根据规则你自然有了八种选择,                   2   3          1       4           H           8       6         7   5                                         分别是 X=   {i-2, i-1, i+1, i+2, i+

逃离大厦第80关与马踏棋盘

今天我在玩一款逃离大厦的解密游戏.在跨越了重重障碍来到了第八十关.这一关很有意思 每次点击都会直接冲到底,要求填满所有空白的地方. 本来很容易,但是很不幸,一旦点击了就不能修改,楼主于是想到了马踏棋盘,终于可以学以致用了于是毫不犹豫 上代码 #include <stdio.h> #include <stdlib.h> #define N 5+2 typedef struct { int a[N][N]; int lstep[4]; int rstep[4]; int cnt; }H

002:马走日

002:马走日 题目链接:http://cxsjsxmooc.openjudge.cn/2017t2summerfinal/002/ 总时间限制: 1000ms 内存限制: 1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T(T < 10),表示测试数据组数.每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,

马走日

马走日 链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1219时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第一行为整数T(T < 10),表示测试数据组数. 每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始