Python 用递归填充二维列表

-3 投票
2 回答
1115 浏览
提问于 2025-04-18 03:33

我需要写一个程序,能够递归地填充一个二维列表。这个列表就像一个网格,长得像这样:

I - I - I - - - 
I I - - - - - - 
I I I I - - - - 

然后用户会输入列和行的数字。程序接着会把那个区域的“-”替换成“@”。比如说,如果行是1,列是4,那么它看起来会像这样:

I - I @ I @ @ @
I I @ @ @ @ @ @
I I I I @ @ @ @ 

我必须用递归来实现这个功能。我现在只能让它部分填充一行。请帮帮我。

2 个回答

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

这个代码会通过移动到四个邻居的位置来寻找一个可以填充的点。

要注意,这里使用的是x-y坐标(从0开始计数)。所以如果你想用行列坐标(从1开始计数),只需要这样转换:

fill(column - 1, row - 1)
1

这个程序其实很简单,如果你从网格的右下角开始,然后向回递归到(0, 0)的位置。我们一步一步来看看这个逻辑:

  • 我们从右下角开始,在你的例子中是(2, 7)。你需要填充所有大于你的边界的部分,在你的例子中是(0, 3)。这些就是我们在递归方法中需要的参数。

    recur_fill(input_list, a, b, i, j)
    
  • 接下来,我们要设置边界条件。你的程序只需要在坐标大于零的时候执行。也就是说,如果 i < 0j < 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()

撰写回答