好吧,我必须编写一个程序来计算骑士(在棋盘上)可以从(xb,yb)到(xe,ye)的路线数量。我不知道我哪里出错了。好吧,我明白伯爵不会添加任何东西,并且会在我的代码中保持0,但我也有这种感觉,我也不会太远。我正在寻找正确方向的推动力。提前致谢
#include <stdio.h>
#include <stdlib.h>
int numRoutes(xb, yb, xe, ye, n){
int count = 0;
if(n>0){
count = count + numRoutes(xb+1, yb+2, xe, ye, n-1);
count = count + numRoutes(xb+1, yb-2, xe, ye, n-1);
count = count + numRoutes(xb-1, yb+2, xe, ye, n-1);
count = count + numRoutes(xb-1, yb-2, xe, ye, n-1);
count = count + numRoutes(xb+2, yb+1, xe, ye, n-1);
count = count + numRoutes(xb+2, yb-1, xe, ye, n-1);
count = count + numRoutes(xb-2, yb+1, xe, ye, n-1);
count = count + numRoutes(xb-2, yb-1, xe, ye, n-1);
}
return count;
}
int main(int argc, char *argv[]){
int xb, xe, yb, ye, n;
printf("Start coordinate: ");
scanf("%d %d", &xb, &yb);
printf("End coordinate: ");
scanf("%d %d", &xe, &ye);
printf("Length: ");
scanf("%d", &n);
int allRoutes = numRoutes(xb, yb, xe, ye, n);
printf("Number of routes: %d\n", allRoutes);
return 0;
}
答案 0 :(得分:0)
这里从x,y开始,想要转到tx,ty,最大长度为n。
在递归方法中,您的函数必须:
如果您想知道找到了哪些路线,您必须管理全局堆栈并在进入时按(x,y),并在离开和找到目标时弹出它。此外,当您找到目标时,您应该将路径保存在某处(堆栈的内容)。
一些改进:
visited[N][N]
数组初始化为0,每次push()时放1,每次pop()时放0。然后,您可以拒绝测试此路线仍然访问过的位置(防止循环,圆圈......)它可能看起来(没有阻止循环,没有检查板限制,并且使用pstack()
打印堆栈内容的函数):
int routes(int x, int y, int tx, int ty, int n) {
int nb = 0; // number found
int lng = ABS(x-tx)+ABS(y-ty); // minimal length to reach destination
if (n < lng) {
return(0); // not possible, it will not be a route
}
push(x, y);
// if we are on destination -> 1: we found a route to destination
if ((x == tx) && (y == ty)) {
pstack();
pop();
return(1);
}
// try each move (8 directions)
nb += routes(x+1, y+0, tx, ty, n-1);
nb += routes(x+1, y+1, tx, ty, n-1);
nb += routes(x+1, y-1, tx, ty, n-1);
nb += routes(x+0, y+1, tx, ty, n-1);
nb += routes(x+0, y-1, tx, ty, n-1);
nb += routes(x-1, y+1, tx, ty, n-1);
nb += routes(x-1, y+0, tx, ty, n-1);
nb += routes(x-1, y-1, tx, ty, n-1);
pop();
return(nb);
}
这会给routes(4, 4, 5, 5, 2);
:
. (4,4) (5,4) (5,5)
. (4,4) (5,5)
. (4,4) (4,5) (5,5)
Found 3 routes from (4,4) to (5,5) with length 2