F: Horse Pro 马走棋盘 BFS

Posted -citywall123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F: Horse Pro 马走棋盘 BFS相关的知识,希望对你有一定的参考价值。

F: Horse Pro

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

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

Input

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

表示当前马所在的位置。

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

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

10000x1,x2,y1,y210000

 

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;
}

 

以上是关于F: Horse Pro 马走棋盘 BFS的主要内容,如果未能解决你的问题,请参考以下文章

算法分析之马走日字

4123:马走日

002:马走日

马走日 (DFS)

一本通1219 马走日

马走日的解法(dfs)