UVA 439 - Knight Moves

题目大意:在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;  
}  


你可能感兴趣的:(UVA 439 - Knight Moves)