题意:8 * 8的标准棋盘上的两个格子(列用啊表示,行用1-8表示),求马最少需要走多少步从起点到终点,例如从a1到b2需要4步。
思路:最短路使用BFS求解,路径长度运用层数的概念,将孩子的路径的长度定为父母的路径长度加一
#include <stdio.h>
#include <iostream>
#include <queue>
#include <cmath>
#include <string>
使用namespace std;
int position [8] [2] = {{1,2},{2,1},{2,-1},{1,-2},{ - 1,-2},{ - 2,-1 },{ - 2,1},{ - 1,2}}; //骑士移动的8个方向
int a1,b1,a2,b2;
字符串xx,yy;
bool squre [8] [8]; //判断当前点是否遍历过
int squr [8] [8]; //记录路径长度
int mic;
struct point {//点
int x,y;
点(int xx,int yy){
X = XX;
Y = YY;
}
};
bool in_out(int x,int y){
如果(X <8 &&ÿ<8 && X> = 0 && Y> = 0)//判断是否出局
返回true;
返回false;
}
void bfs(int x,int y)// BFS求最短路
{
队列<point> all; //队列
点tmp(x,y);
all.push(TMP);
而(!all.empty()){
X = all.front()X。;
Y = all.front()Y。;
all.pop();
for(int i = 0; i <8; i ++){
如果(IN_OUT(X +位置[I] [0],Y +位置[I] [1])&& squre [X +位置[I] [0]] [Y +位置[I] [1]]){
squre [X +位置[I] [0]] [Y +位置[I] [1]] = FALSE;
直齿圆柱[X +位置[I] [0]] [Y +位置[I] [1] =直齿圆柱[X] [Y] 1; //层数的概念记录长度,孩子的路径长度是父的长度加一
如果((X +位置[I] [0])== A2 &&(Y +位置[I] [1])== b2)的回报;
点t(x +位置[i] [0],y +位置[i] [1]);
all.push(T);
}
}
}
}
int main(){
而(CIN >> XX YY >>){
A1 = XX [0] - 'A'; //处理输入
B1 = XX [1] - '1';
A2 = YY [0] - 'A';
B2 = YY [1] - '1';
for(int i = 0; i <8; i ++){
for(int j = 0; j <8; j ++){
squre [i] [j] = TRUE;
直齿圆柱[i] [j] = 0;
}
}
MIC = 999;
squre [A1] [B1] = FALSE;
如果(A1 A2 == && B1 B2 ==){//如果终点与起始点相同
MIC = 0;
}其他{
BFS(A1,B1);
MIC =直齿圆柱[A2] [B2]。
}
cout <<“要从”<< xx <<“到”<< yy <<“获取”<< mic <<“骑士移动。”<< endl;
}
}