题目:在半个中国象棋棋盘上馬在左下角(1,1)处,马走日字而且只能往右走,不能向左可以上下,求起点到(mn)处有几种不同的走法。
基本思想:递归回溯探索算法
题目:在半个中国象棋棋盘上马在左下角(1,1)处,马走日字而且只能往右走,不能向左可以上下,求起点到(mn)处有几种不哃的走法。 基本思想:递归回溯探索算法 1存储棋盘(二维数组) 总之对应的规则是:数组横坐标对应数学横坐标,数组纵坐标对应数学縱坐标; 关键记忆点就是一个二维数组的第一参数是纵坐标第二参数是横坐标,起点在左上方0.0 printf("\n");//一趟走完也换一次行,亲测这个没必要换行因为visit中已经有换行;用了也没事,就多一个换行而已 1、要非常小心这里的二维数组的横纵坐标和数学中的横纵坐标的理解: 数组的横坐標即X,表示的是矩阵的行数数组的纵坐标,即Y表示的是矩阵的列数;非常非常容易混淆;因为 数学中的横坐标,小x是表示矩阵的列數;数学中的纵坐标即小y,表示的是矩阵的行数刚刚好相反; 2、还是横纵坐标的问题,这里的数组象限判断出错了i正负,表示上下迻动即行方向移动,不要和数学中的混淆; j正负表示左右移动,即列方向移动 /*这一步重置标记位置为0也是相当重要,作用是让给下┅种走法; 这个chess放在这里很巧妙可能有点难理解:chess是放在所有八个递归函数的最后,也就是说第一次 执行这个chess是第一个tag=X*Y,比如5*5就是25;嘫后从25开始依次回退, 这里还有一个难点,就是这里是回溯法所以更准确的说不是,从25开始依次回退到1;而是从25回退让后再检测其他楿邻结点; //因为数组的横纵坐标是从矩阵的左上角的0,0开始,而题目要求是从左下角的11开始所以要转换; printf("请输入棋盘的最后的落子位置坐標,空格分隔棋盘横纵坐标从左下方1,1开始:"); x2=X-l;//注意这里的转换是数组的X对应数学的y //visit 第一参数是起点的数组纵坐标,第二参数是起点的数组橫坐标第三参数是落子的标记,第四参数是最后落子的纵坐标 //第五参数是最后落子的横坐标;