【问题标题】:Flood fill algorithm in JavaScript - too much recursionJavaScript 中的洪水填充算法 - 递归过多
【发布时间】:2016-04-05 01:31:33
【问题描述】:

所以,我正在编写一个 Bejeweled 克隆,我的洪水填充功能出现错误。我有一个 15 x 15 不同颜色的珠宝矩阵,我尝试计算填充的瓷砖数量。

函数在这里:

function count(x, y, color) {

  if(matrix[x] && matrix[x][y]) {
    if(matrix[x][y].color != color)
      return;
    cnt++;
    count(x, y+1, color);
    count(x, y-1, color);
    count(x-1, y, color);
    count(x+1, y, color);
    console.log(cnt);
  }
}

怎么了?

【问题讨论】:

  • 有趣。我猜我会说你一遍又一遍地计算相同的单元格......首先是右侧的一个,然后 its 左侧的一个,然后是GO TO start,依此类推。
  • 你不会重新着色你访问过的单元格,你会陷入无限递归。
  • @Chara 边界由 if 条件中的前两个逻辑表达式检查

标签: javascript algorithm recursion flood-fill


【解决方案1】:

看起来您的问题是您的函数没有区分已计算的正方形和未计算的正方形。所以相邻的方格会一直互相计数。

一种解决方案是使用您的网格副本,并修改访问过的方块的颜色,这样它们就不会再次被计算在内。或者,您可以为每个单元格添加一个counted 属性,并在您计算单元格时设置它,如果您尝试计算一个已被计算过的单元格,则返回。然后确保在完成后重置 counted 属性。

类似:

function count(x, y, color) {

  if(matrix[x] && matrix[x][y]) {
    if(matrix[x][y].color != color || matrix[x][y].counted)
      return;
    cnt++;
    matrix[x][y].counted = true;
    count(x, y+1, color);
    count(x, y-1, color);
    count(x-1, y, color);
    count(x+1, y, color);
    console.log(cnt);
  }
}

【讨论】:

  • 我添加了一个matrix[x][y].counted 属性,并在计算平铺时将其设置为true,这样就可以了。然后我在处理完cnt 值后重置它。
  • 是的,这也有效。如果其他人遇到此问题,我会将其添加到我的答案中
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多