象棋中“马”的最少步数问题

1、输入一个n*m的棋盘
2、输入a、b两点
3、求a到b的最少步数(马走日)

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>

using namespace std;

const int MAX = 9;
bool vis[MAX][MAX];//记录访问的状态
//dir方向数组,
int dir[8][2]={{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2},{-1,2},{-2,1}};
 
struct Node
{
    int x;
    int y;
    int step;
    Node(int xx,int yy,int tt=0):x(xx), y(yy), step(tt){}
};

//(x1,y1)起始点,(x2, y2)目标点
int x1,y1,x2,y2;
 
bool in_bound(int x,int y)
{
    return (x>=0 && x<8 && y>=0 && y<8);
}
 
int bfs()
{
    memset(vis,0,sizeof(vis));
    queue<Node> q;
    Node node(x1,y1,0);
    vis[node.x][node.y]=1;
    q.push(node);
    int x,y;
    while(!q.empty())
    {
        node=q.front();
        if(node.x==x2 && node.y==y2)
            return node.step;
        q.pop();
        for(int i=0;i<8;++i)
        {
            x=node.x+dir[i][0];
            y=node.y+dir[i][1];
            if(in_bound(x,y) && !vis[x][y])
            {
                vis[x][y]=1;
                q.push(Node(x,y,node.step+1));
            }
        }
    }
    
    return -1;
}
 
int main()
{
    cin>>x1>>y1 >> x2>>y2;
    cout<<"最小步长是:"<< bfs() <<endl;
    
    return 0;
}    

具体可以学习https://blog.csdn.net/qiancm/article/details/118578776
望采纳