骑士可以从xb,yb到xe的路线数量,在无限的棋盘上

时间:2015-10-15 19:00:39

标签: c recursion

好吧,我必须编写一个程序来计算骑士(在棋盘上)可以从(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;   
}

1 个答案:

答案 0 :(得分:0)

这里从x,y开始,想要转到tx,ty,最大长度为n。

在递归方法中,您的函数必须:

  • 检查是否可能:你需要至少Dx + Dy移动(其中Dx = ABS(x-tx),Dy = ABS(y-ty),如果我是对的,那么如果n
  • 检查你在目的地点。如果是,您有路线(返回1)
  • number = 0
  • 对于每个可能的移动(8个方向,x + 1,y; x-1,y; x + 1,y + 1 ......)用这个新的x,y,相同的目标和n-1调用自己(你使用一个移动)并将结果值加到数字
  • 返回号码

如果您想知道找到了哪些路线,您必须管理全局堆栈并在进入时按(x,y),并在离开和找到目标时弹出它。此外,当您找到目标时,您应该将路径保存在某处(堆栈的内容)。

一些改进:

  • visited[N][N]数组初始化为0,每次push()时放1,每次pop()时放0。然后,您可以拒绝测试此路线仍然访问过的位置(防止循环,圆圈......)
  • 检查x,y以防止访问董事会外的元素
  • 也许会检查棋盘上是否存在其他东西(在其他部分移动,而不是“在其中”)

它可能看起来(没有阻止循环,没有检查板限制,并且使用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