畳の敷き方をRubyで求めるの件ですが,少し手を加えまして,奇数×奇数への対応と,画像生成を行いました.やっつけ仕事ということもあり,Rubyスクリプトは公開していません.
奇数×奇数の場合に使用できる半畳の畳は,1枚だけとしています.この畳が,「4つの角が1箇所に集まっているか」「断層線ができているか」のチェックに使用しなくていいことに気づいて,コーディングが進みました.
6×6までについて,解の数を求めてみました.1×1が半畳分になります.まずは2つのチェック項目を無視して,敷き詰めることができたパターンの数です.
列数\行数 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 1 | 1 | 2 | 1 | 3 | 1 |
2 | 1 | 2 | 3 | 5 | 8 | 13 |
3 | 2 | 3 | 18 | 11 | 106 | 41 |
4 | 1 | 5 | 11 | 36 | 95 | 281 |
5 | 3 | 8 | 106 | 95 | 2180 | 1183 |
6 | 1 | 13 | 41 | 281 | 1183 | 6728 |
必ずしも,下の方,右の方が大きくならないのが,見て取れます.
次に,2つのチェック項目を通った(どちらの状況も存在しない)パターンの数を表にします.
列数\行数 | 1 | 2 | 3 | 4 | 5 | 6 |
1 | 1 | 1 | 2 | 0 | 0 | 0 |
2 | 1 | 2 | 3 | 1 | 0 | 0 |
3 | 2 | 3 | 10 | 2 | 4 | 0 |
4 | 0 | 1 | 2 | 2 | 2 | 1 |
5 | 0 | 0 | 4 | 2 | 2 | 2 |
6 | 0 | 0 | 0 | 1 | 2 | 2 |
3×3は「断層線」チェックが除外されるため,解の数は多めですが,他は4以下です.また「2」となる箇所のパターンを見ると,奇数×偶数では鏡像,偶数×偶数では回転となるのは,少し面白かったところです.
奇数×奇数で小さい値を試して出力を眺めていると,敷き詰めることができたとき,半畳の畳は,隅との(4近傍による)距離が偶数になっています.5×3の出力をtatami_5x3.txt に置いておきます.このケース*1では,中心に半畳の畳があるような解が存在しません.
*1:一般には,縦と横の差が4で割り切れない場合です.最小は1×3および3×1で,このとき明らかに,中央に半畳を置いたら,残りの箇所に1畳分の畳を置くことができません.