【问题标题】:How to recursively get the number of elements until reached all squares in 5 x 5 grid in scala如何递归获取元素的数量,直到在scala中达到5 x 5网格中的所有正方形
【发布时间】:2017-04-05 06:11:14
【问题描述】:

我有一个 5 x 5 的网格。我的初始位置在 (0,0)

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
# 0 0 0 0

我有一种方法可以从那个位置找到所有可能的“L”形位置 所以来自 (0,0)

所以要么

  • ( x + 2 )( y + 1 )

  • ( x + 1 )( y + 2 )

我们有两个职位

0 0 0 0 0
0 0 0 0 0
0 # 0 0 0
0 0 0 0 0
# 0 0 0 0

or

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 # 0 0
# 0 0 0 0

然后我的方法将从所有可能的移动列表中调用它自己并找到每个移动的位置。

仅当可能移动列表中的最后一个位置与初始位置相同时,递归才会中断。

所以可能的位置移动:

  • (0)(0)List((1,2),(2,1))

  • List((possible moves for (1,2) ), (possible moves for (2,1) ) )

等等:

到目前为止我的方法

def CountTour(dimension: Int, path: Path): Int = {
  // possibleMoves returns list of possible moves
  val Moves = possibleMoves(dimension, path, path.head).contains(path.last)

  // if the last element is not the same as first position, and has visited the whole graph, then break the recursion
  if (legalMoves && path.size == (dimension * dimension)) {
    1
  } else {
    // else call the same method again with each possible move
    val newList = for (i <- legal_moves(dimension, path, path.head)) yield i
    count_tours(dimension,newList)
  }
}

但是这行不通。我该如何解决?

【问题讨论】:

  • 你能详细说明“这行不通”吗?
  • 它不会给我所有可能的职位@ScottHunter
  • 它给了你什么?
  • 所以对于 (0,0) 它将返回 List( (1,2),(2,1) )。但现在我需要再次调用该方法以返回 (1,2) 和 (2,1) @jwvh 的移动

标签: scala list for-loop recursion chess


【解决方案1】:

在我看来,您实际上还没有任何工作代码。我这样说是因为 A) 你发布的代码有很多漏洞,B) 当我问你目前得到什么输出时,我没有得到直接的答案。由于这些原因(并且因为这看起来像是一项家庭作业),我不会用真实代码发布答案,而是会描述我认为应该工作的内容。

目标是编写一个函数(实际上是一个方法),它获取棋盘的尺寸,以及棋盘上的起点,并返回耗尽棋盘的所有路径(连续移动)的计数(不返回一个已经访问过的广场)。

1st - 从任何起点都可以移动到 8 个不同的位置(向东/向西/向北/向南移动 2 步,然后向左/向右移动 1 步)。我会编写一个采用网格尺寸和起点的程序。它首先创建所有 8 个可能的新位置的集合(可能是 List),然后只保留那些落在网格内的位置(即没有负数或大于网格尺寸的坐标)。

第二个 - 该列表必须与已访问过的地点列表进行核对,并删除任何重复项。我会使用diff 方法。请注意...

possible_moves diff already_been_there  // one result
already_been_there diff possible_moves  // different result

其中一个就是你想要的。

3rd - 现在你有一个所有允许移动的列表。如果那个列表是空的,那么你就在路的尽头,没有更多的动作可以做。返回1,因为您找到了一条耗尽电路板的路径。

4th - 如果列表不为空,那么您想用新的起点和更新的已经存在的方块列表重新调用相同的过程(递归)。问题是这个列表至少有一个,可能多达八个,新位置。如何在每次迭代中调用不同次数的递归调用?好吧,您要做的是将您的列表从新位置列表更改为递归调用的返回值列表。你知道如何将List[A] 变成List[B] 吗? (提示:它与“nap”押韵。)

5th - 如果你已经走到了这一步,那么你有一个数字列表,每个数字都是从每个新起点用尽板子的方法的计数。把它们加在一起,你就可以计算出从这个起点用尽板子的方法有多少,这就是你返回的数字。

如果我正确地描述了您的目标,并且编码正确,那么您可以查看我的工作。对于 5X5 板,从 0,0 开始,我想出了 625,308 条不同的路径。 (17 行代码,但我并没有试图非常简洁。)

【讨论】:

  • 很好解释。我同意你所说的一切。我很抱歉。我会完全按照你所说的去做。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
相关资源
最近更新 更多