次の問題を解決する必要があります: シンプルだが大きなグリッドマップ (サイズ: mX-times-mY) があります。私は、タイルが障害物によって占有されているか、空いているかだけを区別します。
ここで、n 倍のサイズの比較的小さなスライディング ウィンドウを使用するとします。つまり、n << mX、n << mY です。その n 倍のウィンドウ内の占有タイルと空きタイルのすべての可能な組み合わせに対して、識別子 (数字としましょう) を割り当てます。次に、そのウィンドウのサイズで大きな地図の一部の「スナップショット」を撮ります。
私の質問: マップから抽出された現在のパターンの識別番号を決定するための最も簡単で最速の方法は何ですか?
実演するために: 私は 2x2 ウィンドウ (2x2 マトリックス) を持っています。パターンの組み合わせは 2^(2x2)=16 通りあります。
Pattern #1 #2 #3 #4 #5 #6 #7 #8
00 #0 0# 00 00 ## #0 00
00 00 00 #0 0# 00 #0 ##
Pattern #9 #10 #11 #12 #13 #14 #15 #16
0# #0 0# 0# #0 ## ## ##
0# 0# #0 ## ## 0# #0 ##
with # = obscured
0 = free
パターンを抽出すると仮定します
#0
0#
私のマップから、これが上記の例のパターン番号 10 であることを簡単かつ迅速に特定するにはどうすればよいですか?
これまでの私のアイデア:
1: シンプルなループ
おそらく両方のパターンの差がゼロ行列であるかどうかをチェックして、正しいパターンが見つかるまですべてのパターンをループします。
2: Row-Sum と Column-Sum を識別子として使用する
n 行と n 列すべてを合計し、それらの合計を多次元配列のサブインデックスとして使用します。上記の例: sumRow1 = 1 sumRow2 = 1 sumCol1 = 1 sumCol2 = 1 したがって、私のパターンは patternNumbers[1][1][1][1] = 10 に保存されます。別の例はパターン 16 で、次の場所に保存されます。パターン番号[2][2][2][2] = 16。
ウィンドウが大きい場合の利点: 2*n の合計を計算するだけでよく、それらの合計をすぐに使用して探していたパターンに対処できます。大きな、大きな欠点: 多くの空のエントリが残る (2*n) 次元の配列が必要です。したがって、比較的大きなオーバーヘッドです。
あなたの誰かが前にこれをしたことがありますか?これを解決する方法はありますか?また、いかなる種類の対称性 (回転または線) も考慮しませんでした。
どんな助けでも大歓迎です!