2014-11-04 132 views
1

我正在實施python掃雷的洪水填充算法。奇怪的行爲與Python洪水填充算法

之前,我告訴你的算法,讓我定義一些事情是很重要的:

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,它被coverted成蟒索引,(0,0)和通入此floodfill算法(注我用於原始調試的打印語句)。現在

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 

它說' a',18和4!因此,出於某種原因,floodfill算法在第一個if分支上從16跳到18。這對我來說絕對沒有意義,我不知道爲什麼我會得到這種奇怪的行爲。如果您查看其餘的輸出結果,您也可以看到它在某些點上跳躍了兩行索引。

任何人都可以看到算法有什麼問題嗎?

回答

1

你在說if row < len(BOARD[row])它正在比較行索引與行(即列數)的長度,而不是行數。同樣,您將col(列索引)與len(BOARD)進行比較,但len(BOARD)肯定是行數,而不是列數。

+0

賓果。偉大的發現。用len(BOARD)交換len(BOARD [row]) - 1 - 1的一切工作方式都應該如此。非常感謝。 – JavascriptLoser 2014-11-04 01:06:50