2、在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字...而且只能往右走...不能向左...可上可下...求从起点到(m,n)处有几种不同的走法(函数的递归调用)
/*在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字...而且只能往右走...不能向左...可上可下...求从起点到(m, n)处有几种不同的走法*/#include <stdio.h>//棋盘的宽度和高度(半个)#define W 9#define H 5#define LOW -1//下界//棋盘(标记当前点是否被访问过)static int chess[H][W];//标记路径的条数static int count;//置零void ClearState(){ int i, j; for (i = 0; i<H; ++i) { for (j = 0; j<W; ++j) { chess[i][j] = 0; } } count = 0;}//是否可以通过int IsPass(int i, int j){ return ( (i>LOW && i<H) && (j>LOW && j<W));}//搜索路径(回溯算法)void Path(int i, int j, int m, int n){ //保证坐标未出界且未被访问 if (IsPass(i, j)) { //到达目标点 if (i == m - 1 && j == n - 1) { count++; return; } //未达到目标点, 继续搜索 //标记当前点已被访问 //chess[i][j] = 1; Path(i - 1, j + 2, m, n);//水平右上 Path(i + 1, j + 2, m, n);//水平右下 Path(i - 2, j + 1, m, n);//垂直右上 Path(i + 2, j + 1, m, n);//垂直右下 //标记当前点未被访问(其它方向的也需要遍历) //chess[i][j] = 0; }}int main(){ int m, n; while (1) { PRintf("m n : "); scanf("%d %d", &m, &n); Path(0, 0, m, n); printf("共有%d种走法/n/n", count); ClearState(); } return 0;}
新闻热点
疑难解答