题目描述:马在中国象棋以日字形规则移动,给定n*m大小的棋盘,以及马的初始位置(x,y)和目标位置(s,t),要求不能重复经过棋盘上的同一个点,计算马至少走多少步可以到达目标位置,所有棋盘保证从初始位置到结束位置一定有路径可达。
输入描述:测试数据包含一行,为六个整数,分别为棋盘的大小以及初始位置坐标nmxyst。(1≤x,s≤n≤5,1≤y,t≤m≤5)
输出描述:包含一行,为一个整数,表示马能到达目标位置的最小步数。
样例输入:3 3 1 1 1 3
样例输出:2
代码:
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int a[1000][1000];
int mx[10] = {-2,-2,-1,-1,1,1,2,2};
int my[10] = {-1,1,2,-2,2,-2,1,-1};
int n,m,x,y,s,t,k = -1;
void bfs(){
int x_x,y_y;
q.push(x);
q.push(y);
x_x = q.front();
q.pop();
y_y = q.front();
q.pop();
k++;
a[x_x][y_y] = k;
while(!q.empty()){
for(int i = 0;i < 8;i++){
if(a[x_x + mx[i]][y_y + my[i]] == -1){
a[x_x + mx[i]][y_y + my[i]] = k;
q.push(x_x + mx[i]);
q.push(y_y + my[i]);
if(s == x_x + mx[i] && t == y_y + my[i]){
cout<<k;
return;
}
}
}
}
}
int main() {
cin>>n>>m>>x>>y>>s>>t;
for(int i = 0;i < 1000;i++){
for(int j = 0;j < 1000;j++){
a[i][j] = -1;
}
}
return 0;
}