【问题标题】:Water pipe coding exercise. How do I visualize solving this problem水管编码练习。我如何可视化解决这个问题
【发布时间】:2021-12-08 05:33:30
【问题描述】:

这是一个在线练习,我试图了解解决方案。

问题是:

给定下图(一个多维数组),0 值充当 pipe 和 1 值充当水泥。我需要编写代码来确定 如果“管道”从第一个数组的顶部延伸(你可以这样说 是管道的“开口”)到最后一个数组的底部。

const arr = [
    [0, 0, 0, 0, 1],
    [0, 0, 1, 0, 0],
    [0, 0, 0, 1, 0],
    [1, 1, 1, 1, 0],
    [1, 0, 1, 1, 0],
]

您为上述数组编写的代码将输出“true”,因为 0 个值形成以下模式(用星号替换):

const arr = [
    [0, 0, 0, *, 1],
    [0, 0, 1, *, *],
    [0, 0, 0, 1, *],
    [1, 1, 1, 1, *],
    [1, 0, 1, 1, *],
]

在我的脑海中,我将这个问题想象为我将创建一个指针以在数组中移动的问题。如果规则只要求编码器在每个数组中使用一个 0,那么问题将很容易解决。由于有多个死胡同,我的思绪变得糊涂了。我认为有一种更简单的方法来看待这个问题,即循环思考。我知道这可以被数学化,但我不是一个数学家。

我的补救方法是简单地创建一组函数,例如:

checkSurroundingValues()
goForward()
goBackward()
goLeft()
goDOwn()
goUp()

etc ,但是这样做会演变成一个过于复杂的混乱。我认为有一些技巧可以可视化如何完成这个问题。我想清楚地了解“诀窍”和思维过程。

我觉得要走的路是编写跟随每个“零”的代码,并有效地产生一个新的“爬虫”来跟踪每条线索,但我不知道如何编写。 :)

【问题讨论】:

    标签: javascript arrays path-finding


    【解决方案1】:

    这样做会演变成一个过于复杂的混乱

    它比你需要的更重复,但不会那么多。

    首先创建一个迄今为止访问过的索引集或数组,例如1_2 对应于访问过arr[1][2]。制作一个递归函数:

    • 检查被迭代的位置是否已经被访问过。如果是,返回

    • 检查被迭代的位置是 1 还是 0。如果是 1,则返回。

    • 检查被迭代的位置是否有最大的 x 索引(在这种情况下你在底部);返回真

    • 使用所有四个周围的正方形递归调用函数:(0, 1), (1, 0), (0, -1), (-1, 0)。如果任何递归调用返回 true,则返回 true。应该很简单

      return [
        recuse(x + 1, y),
        recuse(x - 1, y),
        recuse(x, y + 1),
        recuse(x, y - 1),
      ].some(Boolean);
      
    • 要开始递归,请为输入数组中索引 0 处的所有顶部元素调用该函数。

    你必须做很多事情才能把它放在一起,但这是一个非常简单的算法。

    【讨论】:

    • 谢谢!我会把它塞进我的脑袋里。这似乎对其他类似问题很有用。我觉得我现在应该知道如何做这种事情了。
    • 我在理解您制定的流程时遇到了一点麻烦。我编写了一个函数,它获取所有值为零的数组切口,并将它们的位置推送到一个新的返回数组。我知道那不是指示。我正试图回到正轨并想象你试图告诉我的内容。也许你可以和我一起工作,帮助我把我所做的事情推向更好的方向。我觉得我在理解的边缘,但需要被推动。 jsfiddle.net/k4zqhw8s/1
    • 小提琴代码使用了一种完全不同的方法,一种自顶向下而不是无向递归的方法。对于自上而下的算法,跟踪找到的指标是没有用的,因为你总是从arr[0],然后到arr[1],然后到arr[2],等等——如果你只需要弄清楚哪些索引为 0,使用自上而下的方法,而不跟踪先前找到的节点。
    • 你可能想要arr[index].forEach((val, indexInner) => { if (val === 0) { visited.push([parentIndex, indexInner]); } })
    • 当然,这是一个起点。但请注意,您从 所有 顶级元素开始递归,而不仅仅是单个元素(如 [0][0])。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多