题目大意:在8 * 8 的棋盘上以日字方式来行走从起点到终点最少需要几次
解题思路:由于是8 * 8 的棋盘所以任意两点只需要 6 步到达,所以可以采用 DFS 剪枝的方式解答。
#include<stdio.h> int x, y, max, dir[8][2] = {{2, 1}, {2, -1}, {-2, -1}, {-2, 1}, {-1, -2}, {-1, 2}, {1, -2}, {1, 2}}; void explore(int a, int b, int step) { if (a < 0 || a > 7 || b < 0 || b > 7 || step >= max) //如果越界则说明不能到达终点,探索结束 return ; if (a == x && b == y && step < max) { //如果到达终点且距离最短就记录下来 max = step; return ; } for (int i = 0; i < 8; i++) explore(a + dir[i][0], b + dir[i][1], step + 1); //向8个方向探索 } int main() { char str1[5], str2[5]; while(scanf("%s%s", str1, str2) != EOF) { int a = str1[0] - 'a', b = str1[1] - '1'; //记录起点位置 x = str2[0] - 'a', y = str2[1] - '1', max = 6; //记录终点位置, 初始化 max explore(a, b, 0); //寻找所有可以到达终点,记录下距离最短的那条 printf("To get from %s to %s takes %d knight moves.\n", str1, str2, max); } return 0; }