题目链接:点击打开链接
题意:给出“马”的初始位置和最终位置,求“马”行走的最少步数。
分析:典型的BFS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int vis[10][10], fx, lx, fy, ly;//初始位置及最终位置
int dx[8] = {1, 1, -1, -1, 2, 2, -2, -2};//可以走的八个方向
int dy[8] = {2, -2, 2, -2, 1, -1, 1, -1};
char a[3], b[3];
struct node{//每到一个位置(x,y)时花费步数num
int x, y, num;
};
void bfs(int x, int y){
node t, p;
queue<node> q;
t.x = x;
t.y = y;
t.num = 0;
memset(vis, 0 , sizeof(vis));
q.push(t);
vis[t.x][t.y] = 1;
while(!q.empty()){
t = q.front();
q.pop();
if(t.x == lx && t.y == ly){
printf("To get from %s to %s takes %d knight moves.\n", a, b, t.num);
return;
}
for(int i = 0; i < 8; i++){
int nx = t.x + dx[i], ny = t.y + dy[i];
if(nx > 0 && nx < 9 && ny > 0 && ny < 9 && !vis[nx][ny]){
p.x = nx;
p.y = ny;
p.num = t.num + 1;
q.push(p);
}
}
}
}
int main(){
while(~scanf("%s%s", a, b)){
fx = a[0] - 'a' + 1;
fy = a[1] - '0';
lx = b[0] - 'a' + 1;
ly = b[1] - '0';
bfs(fx, fy);
}
return 0;
}