空交叉点计数

时间:2012-04-18 04:48:59

标签: algorithm linear-algebra

我正在实施一个7 x 7的棋盘游戏,w =白色宝石,b =黑色宝石。我想算一下最终结果。请记住,这是一个游戏,我们只计算被黑色或白色石头包围的空单元格。

 0 1 2 3 4 5 6
0    b
1    b w  
2b b w   w
3  w       w
4    w     w
5      w w w
6

我想计算w和b包围的所有交叉点,这意味着我想计算白色宝石和0,0 0的细胞2,3 3,3 3,3 3,4 4,3 4,4, 1 1,0 1,1黑石头。我提出的所有算法都太复杂了。

我将使用GNU汇编程序实现最终解决方案。我刚开始学习汇编语言,所以我不希望它变得复杂。该算法可以使用循环和数组,但不能使用递归或函数调用。

我想看看线性代数中是否有一个简单的算法来解决这个问题,或者如果你能在不使用递归和函数调用的情况下描述一个简单的算法,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

泛洪填充类型算法可能适用:

  1. 找到第一个未分配的单元格。
  2. 如果单元格为空,则从中填充,在边缘单元或占用单元处停止。
    1. 对于遇到的第一个被占用的单元格,记录占用者的颜色。
    2. 如果遇到的被占用单元格颜色不同,请记录多个颜色。
    3. 填充后,如果只遇到一种颜色,请将整个区域标记为属于该颜色。该区域中的空单元格数将添加到计数中。
  3. 从步骤1开始重复,直到分配完所有单元格。
  4. 洪水填充是一种相当标准的算法,如:

    1. 将起始单元推入堆栈。
    2. 虽然堆栈不是空的:
      1. 从中弹出一个单元格。
      2. 如果尚未处理该单元格(即在此情况下未分配):
        1. 处理它(即在这种情况下查看其颜色)。
        2. 将所有邻居推入堆栈。
    3. 请注意,对于这些算法,如果电路板被一层不可见的“边缘”单元所包围,它可以更容易。边缘单元和占用单元没有邻居用于算法。

      请参阅http://en.wikipedia.org/wiki/Flood_fill

答案 1 :(得分:0)

我会尝试一种算法,它沿着由空格形成的形状边缘移动,如下所示:

  1. 从一个与空地相邻的地方开始。
  2. 通过测试所有相邻的空间,沿着由空白空间形成的形状的外边缘行进。
  3. 如果您遇到电路板的边缘,您可以继续沿着电路板的边缘行进。
  4. 如果沿着形状边缘遇到黑色和白色碎片,则形状不属于任何玩家。
  5. 否则,刚刚勾勒出的形状属于拥有所有边框的玩家。
  6. 然后,您可以使用形状来确定每个玩家拥有的空间数量。

    因为这个问题被标记为“家庭作业”,所以需要考虑更多:这种情况的结果是什么,你如何解释它?

     0 1 2 3 4 5 6
    0
    1  w w w w w w
    2  w
    3  w   b b b
    4  w   b   b
    5  w   b b b
    6  w