二次元配列の要素を、別の配列のデータに従って入れ替えたいです。

今、1つの配列に縦5横6の二次元配列があり、配列(array)の中身は全て "." で埋まっています。つまりarrayは

array = [
  [".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."],
  [".",".",".",".",".","."]  # ←①
]

となっています。

この "." を str_array 配列の数字に従って書き換えたいです。たとえば str_array

str_array = [[1, 1, 0], [1, 3, 2], [3, 3, 1]]

のときを考えます。この str_array は要素を3つもっています。

  • 最初の [1, 1, 0] はarrayの最後のブロック(①で示したもの)を書き変えます。
    • [1, 1, 0] の 0 は [".",".",".",".",".","."] の左から0番目の場所を表し、1, 1 は縦横1つずつの "." を書き換えることを示します。
    • これによって、最後のブロックが ["#",".",".",".",".","."] になるということです。
  • 次の [1, 3, 2] は左から2番目の "." を書き換えます。今 array は

    array=[
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        ["#",".",".",".",".","."]
    ]
    

    という状態であり、一番下のブロックの左から2番目が空いているので、縦1横3で "#" を敷き詰め、下のように書き換わります。

    array=[
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        [".",".",".",".",".","."],
        ["#",".","#","#","#","."]
    ]
    
  • 最後の [3, 3, 1] は左から1番目の "." を書き換えますが、一番下のブロックには縦横3つをもう入れ替えられないので、

    array=[
        [".",".",".",".",".","."],
        [".","#","#","#",".","."],
        [".","#","#","#",".","."],
        [".","#","#","#",".","."],
        ["#",".","#","#","#","."]
    ]
    

    と array を書き換えます。

最終的に、

array=[
    [".",".",".",".",".","."],
    [".","#","#","#",".","."],
    [".","#","#","#",".","."],
    [".","#","#","#",".","."],
    ["#",".","#","#","#","."]
]

を出力させたいです。

これを行えるようなアルゴリズムとしてfor文をまず思いつきました。次にスタート "." を入れ替えられるように 4 * 6 + 1 という風に (縦幅-1) * 横幅 + スタートの順番 という式を使うのではと思いましたが、これらをどう組み合わせればいいのかわかりません。特に "." が既に埋まっていて "#" になっている時とそうでない時で処理が違います。このプログラムはどのように書けますか?

今の断片コードですが、

for i in range(len(str_array))
    str_array[0][i] * str_array[1][i] + x

(xはスタートの順番)と書きました。