简单的BFS。只是国际象棋的棋盘有点特殊,坐标需要转换下。
AC代码:
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
struct node
{
int x, y, count;
};
int xy[8][2] = {-1, -2, -2, -1, -2, 1, -1, 2, 1, 2, 2, 1, 2, -1, 1, -2};
int num[10][10];
int ans;
int bfs(int x1, int y1, int x2, int y2)
{
int x, y, z;
memset(num, 0, sizeof(num));
queue<node> Q;
node n;
n.x = x1;
n.y = y1;
n.count = 0;
num[x1][y1] = 1;
Q.push(n);
while(!Q.empty())
{
n = Q.front();
Q.pop();
x = n.x;
y = n.y;
z = n.count;
if(x == x2 && y == y2)
return z;
for(int i = 0; i < 8; i++)
{
if(x + xy[i][0] >= 1 && x + xy[i][0] <= 8 && y + xy[i][1] >= 1 && y + xy[i][1] <= 8)
{
if(num[x + xy[i][0]][y + xy[i][1]] == 0)
{
n.x = x + xy[i][0];
n.y = y + xy[i][1];
n.count = z + 1;
num[n.x][n.y] = 1;
Q.push(n);
}
}
}
}
return 0;
}
int main()
{
// freopen("1.txt", "r", stdin);
char str1[3], str2[3];
while(cin >> str1 >> str2)
{
int x1 = str1[0] - 'a' + 1;
int y1 = 8 - (str1[1] - '1');
int x2 = str2[0] - 'a' + 1;
int y2 = 8 - (str2[1] - '1');
cout << "To get from " << str1 << " to " << str2 << " takes " << bfs(x1, y1, x2, y2) << " knight moves." << endl;
}
return 0;
}