JavaScript 中的洪水填充算法 - 太多递归

Flood fill algorithm in JavaScript - too much recursion

所以,我正在编写一个 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);
  }
}

怎么了?

您的问题似乎是您的函数无法区分已计数的方块和未计数的方块。所以相邻的方块会一直互相计数。

一个解决方案是使用您的网格副本,并修改访问过的方块的颜色,这样它们就不会被再次计算。或者,您可以向每个单元格添加一个 counted 属性 ,并在您对单元格进行计数时设置它,如果您尝试对一个已经被计数过的单元格进行计数,则设置 return 。然后确保在完成后重置 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);
  }
}