2013-11-24 74 views
0

ALright我必須編寫一個像paint中的自動填充函數那樣的函數。它必須是遞歸的;我得到遞歸的原理,這是我第一次使用它,這裏是我得到的或沿着這些線的東西,然後我要求一組座標來改變「。」。到 「X」 因此,到目前爲止,除了功能好:遞歸函數將<x and y>更改爲矩陣?

.... XX ....

... x..x ...

... X ..x ...

... x..x ...

.... XX ....

我試着用5-6的方法,這是最新的:

def autoFill(yCoordinate,xCoordinate,listOfCharacters,x,y): 

    if listOfCharacters[xCoordinate][yCoordinate]==".": 
     flag=True 
     listOfCharacters[xCoordinate][yCoordinate]="x" 
    else: 
     return 

    if flag==True: 

     if yCoordinate<x and flag2==1: 
      autoFill(yCoordinate+1,xCoordinate,listOfCharacters,x,y,yc,xc) 
     elif yCoordinate>0: 
      autoFill(yCoordinate-1,xCoordinate,listOfCharacters,x,y,yc,xc) 
     elif xCoordinate<x: 
      autoFill(yCoordinate,xCoordinate+1,listOfCharacters,x,y,yc,xc) 
     elif xCoordinate>0: 
      autoFill(yCoordinate,xCoordinate-1,listOfCharacters,x,y,yc,xc) 

    return listOfCharacters 
+0

什麼是輸出應該是什麼樣的?例如,如果我將座標設置爲「(0,0)」。 – aIKid

+0

輸出將基本上改變所有的「。」。在一個特定的區域爲「x」,以便使用您的示例,它會將X的左側的所有點都更改爲x的 – boolean

+0

因此,如果自動填充參數是'start_x,start_y,list,end_x,end_y'? – aIKid

回答

2

也許是這樣的:

def floodfill (chars, x, y): 
     try: 
       if chars [y] [x] == 'x': return 
       chars [y] [x] = 'x' 
       for xoff, yoff in ((0, 1), (0, -1), (1, 0), (-1, 0)): 
         floodfill (chars, x + xoff, y + yoff) 
     except: pass 

例如,這個片段:

a = '''....xx.... 
...x..x... 
...x..x... 
...x..x... 
....xx....''' 

chars = [ [c for c in line] for line in a.split ('\n') ] 
floodfill (chars, 0, 0) 
print ('\n'.join (''.join (c for c in line) for line in chars)) 

print ('-' * 20) 

chars = [ [c for c in line] for line in a.split ('\n') ] 
floodfill (chars, 5, 3) 
print ('\n'.join (''.join (c for c in line) for line in chars)) 

產生輸出:

xxxxxxxxxx 
xxxx..xxxx 
xxxx..xxxx 
xxxx..xxxx 
xxxxxxxxxx 
-------------------- 
....xx.... 
...xxxx... 
...xxxx... 
...xxxx... 
....xx.... 

沒有循環:

def floodfill (chars, x, y): 
     try: 
       if chars [y] [x] == 'x': return 
       chars [y] [x] = 'x' 
       floodfill (chars, x + 1, y) 
       floodfill (chars, x - 1, y) 
       floodfill (chars, x, y + 1) 
       floodfill (chars, x, y - 1) 
     except: pass 
+0

不能使用循環,必須是一個嚴格的遞歸函數 – boolean

+0

@boolean請參閱最後一段。我添加了沒有單一循環的代碼。 – Hyperboreus

0

我看到一些問題。

首先,你在遞歸調用中引用了幾個不存在的變量,ycxc。它們看起來並不需要,也許它們是從先前版本的代碼中繼承下來的。只是擺脫他們。

下一個問題是使用flag2if測試結束,這也是未定義的。放下它。

有在if第二個問題,即你正在測試yCoordinatex寬度,而不是反對y(真的xy都很差的名字,認爲他們改變爲類似widthheight)。

因爲你幾乎就在那裏。另一個問題(以及主要的邏輯錯誤)是,您在最後一個塊中使用elif,而不是讓每個if都被獨立測試。你希望能夠從一個給定的方塊最多四次遞歸,只跳過超出邊界的方向。因此,請將elif設爲常規if s。

哦,你可能想用>=來測試0,因爲那可能是一個有效的座標!

最後一件事情不是bug,但仍然可以改進。您使用flag變量的當前代碼不必要的複雜。您可以通過更改第一個if語句來測試反向(即指定的座標不是".",或者可能不是"x")來簡化它。如果測試結果爲真,您可以執行您目前在else區塊中的。之後,您可以無條件地運行代碼的其餘所有代碼(從將列表值設置爲"x"開始,然後遞歸)。這是遞歸的代碼很常見的結構:

def recursive_func(x): 
    if base_case(x): 
     return 

    recursive_func(something(x)) 
0

所以感謝輸入和這裏是我到目前爲止有:

def autoFill(y, x, matrix,rows,columns): 
if x < 0 or y < 0 or x >= columns or y >= rows: 
    return 
if matrix[y][x] != '.': 
    return 
if matrix[y][x] == '.': 
    matrix[y][x] = 'x' 

autoFill(x - 1, y, matrix,rows,columns) 
autoFill(x + 1, y, matrix,rows,columns) 
autoFill(x, y - 1, matrix,rows,columns) 
autoFill(x, y + 1, matrix,rows, columns) 

return matrix 

遺憾的是它不輸出的權利..

爲像這樣 `

.....xx........ 

....x..xx...... 

....x....xxxx.. 

...x........xxx 

..x............ 

...x........xx. 

...x..xxx...x.x 

...x..x..x.x... 

...xxxx...x.... 

............... 

`

它應該產生這樣的

xxxxxxx........ 

xxxxx..xx...... 

xxxxx....xxxx.. 

xxxx........xxx 

xxx............ 

xxxx........xx. 

xxxx..xxx...xxx 

xxxx..xxxx.xxxx 

xxxxxxxxxxxxxxx 

xxxxxxxxxxxxxxx 

但這是即時得到:

xxxxxxxxxxx.... 
xxxxxxxxxxx.... 
xxxxxxxxxxxxx.. 
xxxxxxxxxxx.xxx 
xxxxxxxxxxx.... 
xxxxxxxxxxx.xx. 
xxxxxxxxxxx.x.x 
xxxxxxxxxxxx... 
xxxxxxxxxxx.... 
xxxxxxxxxxx....