题目: 在中国象棋中,马只能走“日” 字。现有一5*4棋盘,马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次。找出所有路径。
思路:
用二维数组a[6][5]存储棋盘每一点,其值代表该点的遍历顺序,数组下标对应棋盘点的坐标。
对于棋盘上一点A(x,y)有八个拓展方向,即
A1(x+1,y+2)A2(x+2,y+1)A3(x+2,y-1)A4(x+1,y-2)
A5(x-1,y-2)A6(x-2,y-1)A7(x-2,y+1)A8(x-1,y+2)
用数组 fx[8] = { 1,2,2,1,-1,-2,-2,-1 } 和 fy[8] = { 2,1,-1,-2,-2,-1,1,2 } 来模拟马走日时下标的变化。
搜索过程从起始点(x,y)出发,按深度优先原则,从8个方向中寻找一个可以走的点,直到走过棋盘上所有点。
完整代码+注释
# include<stdio.h>
int dep, x, y, count;
//dep为搜索的深度即已遍历的点数,(x,y)为初始坐标,count用于统计走法个数
int fx[8] = {
1,2,2,1,-1,-2,-2,-1 };
int fy[8] = {
2,1,-1,-2,-2,-1