Pythonでタイリング問題を解く方法

スポンサーリンク

この記事では、「タイリング問題」という非常に興味深い問題を理解します。

まず、この問題で何を達成したいかを理解しましょう。

スポンサーリンク

タイリング問題を理解する

タイル貼り問題では、大きさ4*nの壁が与えられる。

これは壁の高さが4で、壁の長さがn(ユーザーから与えられる)であることを意味します。

ここで、サイズ4*1のタイルが無限にあり、それを2通りの方法で壁に並べることができる。

下図はその例です。

1
2
3
4
5
6
7
8
def find_count_arrangements(n):  
    if(n<=3):
        return 1
     
    return find_count_arrangements(n-1) + find_count_arrangements(n-4)
 
n = int(input())
print(find_count_arrangements(n))

我々の目的は、上記のどちらかの方法で小さなタイルを使って、壁一面を埋めるために可能なすべてのパターンを数えることです。

Pythonによるタイリング問題の解決策

ループとif-else条件を使った素朴なアプローチを手作業でコーディングすることもできますし、より高速なアプローチである再帰的アプローチをとることもできます。

もし、再帰についてもっと知りたいなら、以下のチュートリアルを読んでください。

再帰についてもっと読む。

再帰を使用すると、大きな問題を小さな問題に分割することができます。

ではここで、両方のアレンジで小さな問題を見てみましょう。

  1. アレンジメント1:最初のタイルは、壁の長さが4減少し、現在のタイルの上に残っているスペースは、1つの方法でしか埋めることができない方法1に従って置かれます(方法1に従って3タイル)。
  2. アレンジメント2:次に、壁の長さを1減らす方法2に従って、最初のタイルを置くことができます。

最初の配置が終わった後。

残りの壁についても、同じ関数を再帰的に呼び出すが、nの値は減少します。

最終的な解は、それぞれの再帰的な呼び出しで、両方の配置で可能な方法の合計となる。

以下に示す小さな図を通して、いくつかの例について理解しよう。

Arrange Small Tiles Tiling Problem
Arrange Small Tiles Tiling Problem

Pythonでタイリング問題の解を実装する

Recursive Solution Tiling Problem
Recursive Solution Tiling Problem

コードの実装は再帰を使ってとても簡単です。

ただ、先に説明した解決策を理解しているかどうか確認してください。

タイリング問題の問題文、解決策、コードの実装を理解していただけたでしょうか?お読みいただきありがとうございました。

それでは、よい勉強を

タイトルとURLをコピーしました