了解矩阵中的邻居检查

时间:2014-05-13 08:04:40

标签: python

我在stackoverflow上找到了这段代码,并尝试将它用于我自己的代码,但我必须了解每个语句正在做什么。我现在知道感谢jonrshape ,这段代码应检查所有环绕声位置以及是否有邻居1

for x in range(rows):
    for y in range(cols-1): #Loop until the second to last element.
        lives = 0
        if matrix[x][y+1] == 1:
            lives += 1
        if x == 0:  #You probably don't want to check x-1 = -1
            continue 
        if matrix[x-1][y+1] == 1:
            lives += 1

所以我希望有些人可以一步一步地解释它

所以我可以尝试实现它而不会让你烦恼

修改

我认为第一个if是检查第一个位置(x / y)但是右边的邻居是什么

代码来源Python Matrix Neighbor Checking

EDIT2

我的意见声明在做什么

 for x in range(rows):
    for y in range(cols-1):       # thats the part i would like to know how it works,what it does really
        lives = 0

        if matrix[x][y+1] == 1:

            lives += 1
                                      |0||0||0||1||0||0||0||0|...
Checking  the x coord if it is a 1 -> |1|
it increase the the O above to 1      |0|
                                      |0| 
                                      |0|
        if x == 0:  
            continue 

 Checking  the x coord if it is a O -> |0||0||0||1||0||0||0||0|
 if its a 0 than it continue to check. |0|
                                       |0|
                                       |0| 
                                       |0|
        if matrix[x-1][y+1] == 1:     # thats the second part i would like to know how it works, what it does really
            lives += 1

1 个答案:

答案 0 :(得分:0)

要了解此代码的第一个重要事项是每个x循环迭代中的yfor是您当前正在检查的单元格的坐标。然后,您可以在每个坐标中添加或减去1以找到相邻的单元格,如下所示:

 x-1, y-1 | x-1, y | * x-1, y+1
--------------------------------
 x, y-1   | x, y   | * x, y+1
--------------------------------
 x+1, y-1 | x+1, y | x+1, y+1

请注意,有明显的例外情况:

  1. 如果您在第一列(y-1)上,则无法检查y==0;
  2. 如果您在最后一栏(y+1)上,则无法检查y==cols-1;
  3. 如果您在第一行(x-1),则无法检查x==0;和
  4. 如果您在最后一行(x+1),则无法检查x==rows-1
  5. 您发现的代码以两种稍微不同的方式处理它们;首先,从y值范围中排除最后一列:

    for y in range(cols-1):
    

    由于range给出的值但不包括 stop参数,y+1永远不会超出范围。其次,通过显式调用continue来跳过循环的其余部分x == 0

     if x == 0:  
        continue 
    

    因为x-1会起作用(给-1),但这会“回绕”检查最后一行;可能不是理想的行为。

    要实现的第二个重要事项是,此代码因此为最多两个相邻单元格(右上角和右上角,上面用1突出显示)添加lives*如果邻居包含1,则矩阵中的单元格。 lives是一个单个数字 - 函数不会改变matrix (尽管您发表了评论,但它实际上并不会“增加0以上“)。为此,您需要明确地更改值,例如:

    if matrix[x][y+1] == 1:
        matrix[x][y] += 1
    

    你想要的是相似的,但你的函数应该返回一个新的矩阵,其中每个单元格的值是其邻居中'O'的计数(即一个整数) 08)。或者,您可能希望将'O' s包含在输出矩阵中与输入矩阵相同的坐标处。

    有两种方法可以做到这一点:

    • 在相邻的细胞中为每个炸弹添加一个细胞;或
    • 在炸弹的每个相邻牢房中添加一个。