Javascript 在js中使用多维数组查找路径

Javascript 在js中使用多维数组查找路径,javascript,math,multidimensional-array,logic,coordinates,Javascript,Math,Multidimensional Array,Logic,Coordinates,我有一个x-y网格存储在多维数组中。x-y栅格中的每个点都有一个值 例如: var xy = [ [0,3,1,1,0], [0,0,2,2,1], [0,0,1,1,0] ]; 假设var xy的布局类似于x-y栅格(例如,x 1和y 2为3) (1) (2) (3) (1) 0 1 3 (2) 1 X 2 (3) 2 0 1 这是此类变量的较大“打印输出”,具有较大的高度和宽度: (1) (2) (3) (4) (5)

我有一个x-y网格存储在多维数组中。x-y栅格中的每个点都有一个值

例如:

var xy = [
    [0,3,1,1,0],
    [0,0,2,2,1],
    [0,0,1,1,0]
];
假设var xy的布局类似于x-y栅格(例如,x 1和y 2为3)

    (1) (2) (3)
(1)  0   1   3
(2)  1   X   2
(3)  2   0   1
这是此类变量的较大“打印输出”,具有较大的高度和宽度:

   (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
(1) 0   0   0   1   1   1   2   2   1    1    0    0    0
(2) 0   0   1   1   1   2   2   3   2    2    1    0    0
(3) 0   0   0   1   2   2   3   3   2    1    0    0    0
(4) 0   4   0   1   1   1   2   2   1    0    0    0    8
(5) 0   0   0   0   0   0   1   1   0    0    0    0    4
(6) 0   0   0   0   9   9   9   0   0    0    0    0    0 
(7) 0   0   0   0   9   9   0   0   0    0    0    0    0
现在,为了举例,假设上面的布局是一张地图,就像一个棋盘。首先,为了不注意网格上每个点的值,让我们假设我们想知道一个“棋子”可以从哪一个方块到达,比如说,x4 y8……我们可以在js中做如下操作:

 var n = ,//total # of items in grid
    a = ,//a certain point on the grid
    r = 5; //range of movement
 for(var i = 0; i < n; i++){ //this would be a double for or something similar to go through the grid properly, but let's pretend i is a given point on the grid.
    Math.abs(((a.xLocation + a.yLocation) - (i.xLocation + i.yLocation)) <= r) //if the positive difference between the current point in the loop and the location of the certain point is less than or equal to the range....true!
 }
把它想象成一个游戏,每个方块代表着某种地形劣势。有些路径比其他路径更容易,但其他路径更直接。你可以走任何路径到达某个方块,但在移动之前,哪些方块是合法的,哪些是不合法的?所以我们的方块在X2 Y2上,对吗?他有5个移动点。他想知道他可以移动到哪一个。好吧,他可以移动到其中任何一个。但是X1Y1需要1个移动点,X1Y2需要2个,X1Y3需要4个,等等。很容易计算出来。但是如果棋盘更大,每个潜在的(未知的)移动需要点,他可以移动到哪一个方块,他不能移动到哪一个方块?这有意义吗

编辑2:一个稍微复杂一些的示例:

    (1) (2) (3) (4) (5)
(1)  0   1   3   0   0
(2)  1   X   2   1   0
(3)  2   0   1   0   0
(4)  1   0   0   1   3
(5)  0   0   0   0   4
所以我们在这个例子中的部分又是X2Y2,但是他想知道,对于每一个正方形,他是否能达到那里-布尔值,是或否。只有九个正方形很容易,但随着网格的增长,复杂性也会增加。我当然可以手动操作-他能达到X4Y4吗?是的。但是从编程的角度来说,我如何获得这个结果

EDIT3:我刚刚意识到网格的大小是没有意义的。它实际上是范围的大小。例如,如果移动的范围是5,我只需要计算出每个方向5个正方形的可行性。这样就简化了一点

EDIT4:我想我有一个更好的主意。看看最外面的环5。它是否大于0?然后是否。下一个最外面的环(4)。大于1?否。下一个最外面的环。大于2?然后是否。等等。这会起作用还是会导致不正确的结果


答案(甚至只是引导正确的方向)最好使用js或jQuery,但即使您可以通过逻辑进行操作,我也可以将其转换为js或jQuery。

我认为您要做的是一种基本的搜索,在每次迭代中检查周围的方块。我提供了一个模型示例。打开控制台,单击“运行”,它应该打印出示例地图并它可以从(2,2)开始分3步到达的位置

其中有一些额外的代码用于设置,但主要代码是
search\u rec
功能:

function search_rec(
      map, // The input 'difficulty' map
      output, // The output map (puts '1's in spots that can be reached)
              // Should be the same size as the input map
      x, y, // The current/starting position
      limit) { // The number of spaces you are allowed to move

    // If the number of spaces allowed to move is negative, then we can't
    // reach this position, so we stop
    if (limit < 0) {
        return;
    }

    // Otherwise, if the limit is >= 0, then we can make it here and we
    // store that in the output
    output[y][x] = 1;

    // Now, for each of the four directions
    // Check if we're at a map boundary
    if (x > 0) {
        // If we're not, then we recurse, moving our starting point in
        // the given direction, and lowering our limit by 1 (for the
        // base movement) as well as the 'difficulty' of the terrain of
        // the space we're moving into

        search_rec(map, output, x - 1, y,
        //                      ^ change position
                      limit           - 1          - map[y][x - 1]);
        //   lower limit ^ by the base ^ and the difficulty ^
    }
    if (x < map[0].length - 1) {
        search_rec(map, output, x + 1, y, limit - map[y][x + 1] - 1);
    }
    if (y > 0) {
        search_rec(map, output, x, y - 1, limit - map[y - 1][x] - 1);
    }
    if (y < map.length - 1) {
        search_rec(map, output, x, y + 1, limit - map[y + 1][x] - 1);
    }
}
函数搜索\u rec(
map,//输入“难度”映射
输出,//输出映射(将“1”放在可以到达的点中)
//应与输入贴图的大小相同
x、 y,//当前/起始位置
限制){//允许移动的空间数
//如果允许移动的空间数为负数,那么我们就不能移动
//到达这个位置,我们就停下来
如果(限值<0){
返回;
}
//否则,如果限制值>=0,那么我们可以在这里设置,然后
//将其存储在输出中
输出[y][x]=1;
//现在,对于四个方向中的每一个
//检查我们是否在地图边界
如果(x>0){
//如果我们没有,那么我们就会递归,将起点移入
//给定的方向,并将我们的限制降低1(对于
//基础移动)以及地形的“难度”
//我们要进入的空间
搜索记录(映射、输出、x-1、y、,
//^换岗
极限-1-映射[y][x-1]);
//下限^由基数^和难度决定^
}
if(x0){
search_rec(map,output,x,y-1,limit-map[y-1][x]-1);
}
如果(y

希望这个逻辑是有意义的,它实际上解决了你想要解决的问题。

根本不清楚你的增强是如何工作的。从阅读本文中我认为它的意思是当移动范围r=5,其中网格的值是v,那么实际移动am=r*v,所以如果v=0 am=0,如果v=2 am=10,等等。这是否很接近?不是真的。我将尝试分类在上面的课文中重复我实际上想做的事情。等一下!谢谢。我看到了让你绊倒的东西。我说了1或2次-我的意思是1或2个额外的(x1)是次,但仍然…模棱两可。稍微更改了语言,添加了两个其他示例。这是想法吗?我在一个有5个能量单位的单元格中。我可以移动到任何相邻的单元格,如果我移动到的单元格的值为2,那么我的2个能量单位被吸收,我有3个能量单位。我可以移动,只要我有1个或更多的能量单位和c我想进入的细胞的值小于或等于我剩余的能量单位。当我的能量达到0时,我必须等待某个事件,而我的能量会重新充电,或者我只是停下来。问题是对于任何给定的细胞,我能以设定的能量到达哪些其他细胞?你是一个绝对的天才。我最大的遗憾就是这一点我只能给你一票和一个复选标记。如果这是reddit,我会给你金子。