わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

畳の敷き方〜2.半畳対応,画像生成



畳の敷き方を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畳分の畳を置くことができません.