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
望采纳