Python泛洪填充算法的奇怪行为

时间:2014-11-04 00:14:50

标签: python algorithm list flood-fill minesweeper

我正在为python minesweeper实现泛洪填充算法。

在我向您展示算法之前,让我来定义一些重要的事情:

BOARD,当印刷得很漂亮时,看起来像这样:

X 1   1 1 3 X 2 1 2 X 2 2 3 X 2 X X 3 1 2 1 1    
2 2 1 2 X 3 X 3 2 X 2 2 X X 2 3 4 X 4 X 3 X 1    
X 2 1 X 2 3 3 X 2 1 1 1 3 3 2 1 X 2 4 X 4 1 1    
X 2 2 3 3 2 X 4 3 1     1 X 1 1 2 3 4 X 3 1 1 1 1
2 3 2 X X 2 2 X X 1     2 3 3 2 2 X X 3 4 X 2 1 X
X 2 X 3 3 2 3 3 3 2 1 2 2 X X 4 X 3 2 3 X X 2 1 1
1 3 2 2 1 X 2 X 1 2 X 3 X 4 X X 4 3 1 2 X 3 1    
1 2 X 2 2 2 2 1 1 3 X 4 2 3 3 3 X X 3 2 1 1 1 1 1
X 3 1 3 X 2       2 X 2 1 X 1 1 4 X X 1     1 X 2
X 3 1 3 X 2       1 2 2 2 2 2 2 3 X 3 1     2 3 X
2 3 X 2 1 1 1 1 1   1 X 2 2 X 4 X 3 1       1 X 2
X 2 1 1 1 1 2 X 1 1 2 3 X 2 2 X X 2         1 1 1
2 2 1 2 3 X 2 1 1 1 X 2 1 1 1 2 2 2 2 2 1        
X 2 1 X X 3 2 1 1 3 3 2 1 1 1 1 1 2 X X 2        
X 2 1 2 2 3 X 2 1 X X 2 2 X 1 2 X 3 3 X 2   1 1 1
1 2 1 1   2 X 2 2 3 4 X 2 2 2 4 X 3 1 1 1   1 X 1
  1 X 1   2 2 3 2 X 3 2 1 1 X 3 X 2         2 2 2
  1 1 1   1 X 2 X 3 X 1   1 1 2 1 1         1 X 1

显然,X代表地雷,数字代表该地方周围的地雷数量。空的空间显然意味着那里没有数字。基本上BOARD就是我存储信息的方式。

CURRENT_BOARD,当打印得很漂亮时,看起来像这样:

     [A][B][C][D][E][F][G][H][I][J][K][L][M][N][O][P][Q][R][S][T][U][V][W][X][Y]
  [1] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [2] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [3] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O   
  [4] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [5] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [6] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [7] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [8] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
  [9] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [10] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [11] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [12] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [13] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [14] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [15] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [16] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [17] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 
 [18] O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O  O 

零是覆盖的细胞。 BOARD和CURRENT_BOARD具有相同的行数和列数。

最后,

POSSIBLE_MINE_NUMBERS = ['1','2','3','4','5','6','7','8']

因此,当用户输入行和列值(例如1,A)时,它将被转换为python索引(0,0)并传递到此floodfill算法(请注意我用于粗调试的print语句)。

def floodfill(CURRENT_BOARD, row, col):
print row
print col
if BOARD[row][col] in POSSIBLE_MINE_NUMBERS:
    CURRENT_BOARD[row][col] = BOARD[row][col] + ' '
else:
    if CURRENT_BOARD[row][col] != '  ':
        CURRENT_BOARD[row][col] = '  '
        if row > 0:
            print 'a'
            floodfill(CURRENT_BOARD, row - 1, col)

        if row < len(BOARD[row]) - 1:
            print 'b'
            floodfill(CURRENT_BOARD, row + 1, col)

        if col > 0:
            print 'c'
            floodfill(CURRENT_BOARD, row, col - 1)

        if col < len(BOARD) - 1:
            print 'd'
            floodfill(CURRENT_BOARD, row, col + 1)

现在,该算法在除了电路板底行(第17行)之外的任何位置都能正常工作。当我尝试在底行运行它时,例如18,e(17,4)我得到以下输出(由于我的调试)(查看最后3行):

17
4
16
4
15
4
14
4
a
16
4
b
15
3
c
15
5
d
a
17
4
b
16
3
c
16
5
d
a
18
4

它说&#39; a&#39;,18和4!因此,由于某种原因,填充算法在第一个if分支上从16跳到18。这对我来说完全没有意义,我不确定为什么我会得到这种奇怪的行为。如果你查看输出的其余部分,你也可以看到它在某些点跳过两行索引。

有人可以看到算法有什么问题吗?

1 个答案:

答案 0 :(得分:1)

您正在说if row < len(BOARD[row])将行索引与行的长度(即列数)进行比较,而不是行数。同样,您要将col(列索引)与len(BOARD)进行比较,但len(BOARD)肯定是行数,而不是列数。