我需要创建一个递归填充2D列表的程序。该列表形成一个像
的网格I - I - I - - -
I I - - - - - -
I I I I - - - -
然后用户输入列号和行号。该程序然后填写" - "与" @"。因此,如果row = 1且column = 4,它将如下所示:
I - I @ I @ @ @
I I @ @ @ @ @ @
I I I I @ @ @ @
我必须通过递归来做到这一点。我唯一可以做到的就是部分填充。请帮我。
答案 0 :(得分:1)
如果从网格的右下角开始并向后递归到(0,0),程序非常简单。让我们一步一步地走过逻辑:
我们从右下角开始,在你的情况下(2,7)。在你的情况下(0,3)你需要填充大于你边界的所有东西。这些是递归方法所需的参数。
recur_fill(input_list, a, b, i, j)
我们从边界条件开始。只有在坐标大于零时才需要执行程序。即,如果i < 0
或j < 0
我们必须停止。这转化为:
if i < 0 or j < 0:
return
现在,我们需要处理油漆界限,即a和b。只要我们的坐标大于您的界限,我们就需要检查单元格是否有-
并填充@
。转换为:
if i >= a and j >= b:
if input_list[i][j] == '-':
input_list[i][j] = '@'
现在,我们需要递归填充细胞,直到满足我们条件下的所有细胞。即,
recur_fill(input_list, a, b, i - 1, j)
recur_fill(input_list, a, b, i, j - 1)
总结这些,我们有:
from pprint import pprint
def recur_fill(input_list, a, b, i, j):
if i < 0 or j < 0:
return
if i >= a and j >= b:
if input_list[i][j] == '-':
input_list[i][j] = '@'
recur_fill(input_list, a, b, i - 1, j)
recur_fill(input_list, a, b, i, j - 1)
def main():
input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ],
['I', 'I', '-', '-', '-', '-', '-', '-' ],
['I', 'I', 'I', 'I', '-', '-', '-', '-' ]]
recur_fill(input_list, 0, 2, 2, 7)
pprint(input_list)
if __name__ == '__main__':
main()
答案 1 :(得分:0)
input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ],
['I', 'I', '-', '-', '-', '-', '-', '-' ],
['I', 'I', 'I', 'I', '-', '-', '-', '-' ]]
def fill(x, y):
if 0 <= x < len(input_list[0]) and 0 <= y < len(input_list) and input_list[y][x] == '-':
input_list[y][x] = '@'
fill(x, y + 1)
fill(x, y - 1)
fill(x + 1, y)
fill(x - 1, y)
return
这将通过移动4个邻居来搜索要填充的点。
注意这是x-y坐标(0开始)。因此,如果您想使用行列坐标(1个开始),只需将其转换为:
fill(column - 1, row - 1)