C语言我不会,下面这个是易语言的,希望你能借鉴一下:
熟悉国际象棋的人都知道,马在某个方格,可以在一步内到达的不同位置最多有8个。如图所示:
#4#3#
5#0#2
6###1
#7#8#
(1)对马走的方法可以设定一个顺序,如当前位置在棋盘的(i,j)方格,下一个可能的位置依次为(i+2,j+1),(i+1,j+2),(i-1,j+2),(i-2,j+1),(i-2,j-1),(i-1,j-2),(i+1,j-2),(i+2,j-1),实际可以走的位置很明显仅仅限于还未走过的和不越出边界的那些位置。
(2)这里我们定义马在一步内实际可以走的位置数为马在当前位置的出口数,另外为便于程序的统一处理,这里引入两个数组“行变化数组”和“列变化数组”,分别储存8种可能走法对马当前所在位置的横纵坐标的增量。
(3)本题用贪心法策略求解。当马处于某一位置时,其选择下一位置的准则为:从马当前位置所允许走的位置中,选择出口数最少的哪个位置。如马的当前位置只有3个出口,它们的出口数分别为4,2,3,则程序就选择出口数为2的那个出口。算法简单描述,马从棋盘第一行第一列位置开始出发;预设着法选择顺序控制变量“方法编号”为1;
{
循环判断首()
模拟棋盘数组初始化为0;
行号=起始行号;列号=起始列号;
计次循环首(63,当前遍历步数)
如果(马当前位置没有出口)
返回(-1)
否则行号按返回方法改变;列号按返回方法改变。
在棋盘相对位置记录为第几步骤;
如果(找到解)
输出模拟棋盘数组;
终止循环;
否则方法编号=方法编号+1;
循环判断尾(没有找到解)
}
上述算法在整个找解的过程一直向前,所以能非常快地找到解。但是对于某些开始位置,实际上有解可程序第一次找不到解,则程序只要变换8中可能出口的顺序,就能找到解。考虑到这种变换8种方法的情况,程序引用“方法编号“用于控制8种可能走法的顺序。开始为1时不能找到解,就让方法编号加1,重新找解。