e2 e4 a1 b2 b2 c3 a1 h8 a1 h7 h8 a1 b1 c3 f6 f6
To get from e2 to e4 takes 2 knight moves. To get from a1 to b2 takes 4 knight moves. To get from b2 to c3 takes 2 knight moves. To get from a1 to h8 takes 6 knight moves. To get from a1 to h7 takes 5 knight moves. To get from h8 to a1 takes 6 knight moves. To get from b1 to c3 takes 1 knight moves. To get from f6 to f6 takes 0 knight moves.
广搜,可以直接搜索出最短的路线
代码:
#include <cstdio> #include <cstring> #include <climits> #include <queue> using namespace std; int x1, yl, x2, y2; int d[8][2] = { { 1, -2 }, { 2, -1 }, { 2, 1 }, { 1, 2 }, { -1, -2 }, { -2, -1 }, { -2, 1 }, { -1, 2 } }; struct point{ int x; int y; int step; }p,pp; queue <point> all; bool isok(int x, int y){ if (x >= 1 && x <= 8 && y >= 1 && y <= 8) return true; return false; } int bfs() { if (x1 == x2&&yl == y2) return 0; p.x = x1, p.y = yl, p.step = 0; all.push(p); while (!all.empty()) { p = all.front(); all.pop(); for (int i = 0; i < 8; i++){ int xx = p.x + d[i][0]; int yy = p.y + d[i][1]; if(isok(xx, yy)){ pp.x = xx, pp.y = yy, pp.step = p.step + 1; all.push(pp); if (pp.x == x2&&pp.y == y2) return pp.step; } } } } int main() { char a[10], b[10]; while (scanf("%s%s", a, b) != EOF) { x1 = a[0] - 'a' + 1; yl = a[1] - '0'; x2 = b[0] - 'a' + 1; y2 = b[1] - '0'; while (!all.empty()) all.pop(); printf("To get from %s to %s takes %d knight moves.\n", a, b, bfs()); } return 0; }