Javascript 在棋盘游戏中是否有一种算法可以找到所有可能的路线?

Javascript 在棋盘游戏中是否有一种算法可以找到所有可能的路线?,javascript,algorithm,path-finding,Javascript,Algorithm,Path Finding,我试图编写一个javascript函数,在棋盘(一个15x15网格)上查找长度为N的所有可能路径,玩家不能在其中对角移动。我能够想出一个非常简单的递归解决方案,但我怀疑它是非常不优化的 代码如下: search(n, u, v) { if (n == 0 || isWall(u, v)) return; board[v][u] = 2; search(n - 1, u, v - 1); search(n - 1, u

我试图编写一个javascript函数,在棋盘(一个15x15网格)上查找长度为N的所有可能路径,玩家不能在其中对角移动。我能够想出一个非常简单的递归解决方案,但我怀疑它是非常不优化的

代码如下:

search(n, u, v) {

    if (n == 0 || isWall(u, v))
        return;
        
    board[v][u] = 2;
    
    search(n - 1, u, v - 1);
    search(n - 1, u + 1, v);
    search(n - 1, u, v + 1);
    search(n - 1, u - 1, v);
    
    return;
}
board是包含board数据的2d数组。自由空间、墙和可达空间分别用0、1和2表示


编辑:正如下面提到的,我正在尝试在N次或更少的移动中查找所有可到达的单元格。

您应该使用广度优先搜索来完成您的问题。你可以阅读有关BFS的文章。下面是我用Java编写的unran代码。我建议不要使用它,因为我在StackOverflow编辑器中对其进行了编码,但基本思想就在这里

公共类BFS{
静态最终整数最大值=100;
公共静态void main(字符串[]args){
int[][]板=新int[MAX_N][MAX_N];
队列q=新的LinkedList();
列表可访问=新建ArrayList();
布尔[][]vist=新布尔[MAX_N][MAX_N];
q、 添加(新点(0,0,0));
vist[0][0]=真;
而(!q.isEmpty()){
点电流=q.poll();
如果(vist[curr.x][curr.y])继续;
如果(当前移动>N)继续;
add(新的int[]{curr.x,curr.y});
//未显示dx和dy阵列
对于(int i=0;i<4;i++){
int nx=电流x+dx[i];
int ny=当前y+dy[i];
如果(nx<0 | | nx>=MAX|N | ny<0 | ny>=MAX|N)继续;
如果(线路板[nx][ny]==1)继续;
vist[nx][ny]=真;
q、 添加(新点(nx、ny、当前移动+1));
}
}
//你现在有了你的可达点。
}
}
类点{
公共int x,y,move;
公共点(整数x,整数y,整数移动){
这个.x=x;
这个。y=y;
this.move=移动;
}
}

像其他人写的一样,应该使用广度优先遍历,而不是深度优先遍历

其次,您不应该重新访问已标记为值2的单元格,因此继续的条件应该是当前单元格的值为0

我建议使用两个数组实现遍历:

功能搜索(板、n、u、v){
让计数=0;
让前沿=[[u,v]];
while(n-->0&&frontier.length){
让newFrontier=[];
为了(让[u,v]的边界){
如果(电路板[v]?[u]==0){
董事会[v][u]=2;
计数++;
推送([u,v-1],[u+1,v],[u,v+1],[u-1,v]);
}
}
前沿=新前沿;
}
返回计数;
}
让董事会=[
"11111111111111",
"10000000000001",
"10000000000001",
"10011100111001",
"10010000001001",
"10010000001001",
"10000000000001",
"10000000000001",
"10000000000001",
"10010000001001",
"10010000001001",
"10011100111001",
"10000000000001",
"10000000000001",
"11111111111111"
].map(row=>Array.from(row,Number));
设res=search(board,6,2,2);
log(“达到的单元格数:”,res);

console.log(board.map(row=>row.join(“”).join(“\n”))从技术上讲,您在这里所写的并不是“长度为N的所有可能路径”,而是“N次或更少移动中的所有可到达单元”,这相当容易。您真正想要哪一个?是的,可以找到所有路由,但通常太多而无法迭代。可以计算路径数或显示n个移动中可到达的位置。对于每个可到达的单元格,您可以使用A*搜索算法找到到该单元格的最短路径。这会给你一条通往每个细胞的路线,但不是所有的路线。这是否足够?