質問に 2 票の賛成票が投じられたことをうれしく思います。混乱を避けるために、ここで質問を言い直します。
問題は、mxn グリッド/マトリックスを、穴のないランダムだが事前定義された形状で埋める方法です。定義済みの形状には変数 k があり、これは形状が構成されているブロックの数です。各ブロックは正方形で、グリッドの正方形 (つまり、1x1 グリッド) と同じサイズです。図形は、グリッドに収まるように回転できますが、縮小または拡大することはできません。k は 1 回のラウンドで変化しません。つまり、応答スクリプトを実行している間、m、n、および k は変化しません。スクリプトを 2 回目に実行すると、それらの 1 つまたはすべてが変更される可能性があります。たとえば、初めて、k=4、m=10、n=20 で応答スクリプトを実行する場合があります。スクリプトが終了し、出力が出力されます。2 回目は k=3、m=6、n=10 とします。m かける n と積変調 k がゼロ (mxn % k = 0) に等しいことを保証して、それらが数学的に互いに適合することを確認します。さて、もう 1 つの条件: 1
スクリプトは、プリセット k のプールからランダムな形状でグリッドを埋める必要があります。k=2 の場合、事前定義された形状は 1 種類だけで、2 つのブロックが一緒になります。回転なしで考えると、横と縦の2種類があります。k=4 の場合、グリッドは基本的に Tetris ブロックでいっぱいになります。つまり、全部で 7 種類の事前定義された形状 (それぞれが回転し、最大 20 種類を作成できます) です。k=5 の事前定義された形状は何ですか? まだわかりません。k=5 のすべての形状を見つけることは難しくないため、答えはそれを計算するか、ハードコードすることができます。
解が限られている場合、乱数は必要ありません。たとえば、m=2、n=2、および k=4 です。または m=1、n=4、k=2。他の方法はありません。ランダムではありません。
グリッドのどこにも穴を残すことはできません。mxn と mxn%k=0 の多くのグリッドには、穴のない解があると思います。直感的には合理的に聞こえますが、数学的にはわかりません。m または n が k の倍数である場合、(すべての直線棒の) 解があることが保証されます。
理想的には、k は k<10 のような小さい整数である必要がありますが、2 から 5 の範囲は許容されます。より単純な場合、Tetris にはよく知られている 7 つの形状 (ITOLJSZ) が付属しているため、4 などの固定の k をここで使用できます。
できればPerlで解決策を探しています。パイソンでも大丈夫です。プログラムの実行には、毎回 m、n、k が必要です。ここでも、m,n,k を mxn%k=0 に適合させます。
Perl で試してみた自分の努力で、k=3 のいくつかのケースを解決でき、エッジ/コーナーのシングルトン (穴) のためにいくつかのケースで失敗しました。ブロックがシングルトンになるかどうかを確認する良い方法が必要です。私のテキスト出力は次のようになります (m=4、n=9、k=3)。もちろん、この種の形式または意味のある任意の形式を使用できます。
AABB
ACCB
DCEE
DFFE
DFGH
IGGH
IIJH
KKJJ
KLLL
最高のソリューションを授与するために、100 ポイントの報奨金を設定します (2 つの賛成票に感謝します。現在、107 の評判があります)。
ご意見ありがとうございます。