2011-03-08 14 views
1

このタイトルは完全には私が意味するものではありませんが、私はより良いものを考え出すことができません。私の問題点を説明しましょう。複製された行列を削除するにはどうすればいいですか?

私は多くの配列を要素として持つ配列を持っています。これは、実際には

[ 
[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p], 
[i, j, k, l, m, n, o, p, a, b, c, d, e, f, g, h], 
[m, i, e, a, n, j, f, b, o, k, g, c, p, l, h, d], 

... 

] 

のように見える、すべての要素が行列を表し、あなたが

[ 
+-   -+ 
| a, b, c, d | 
| e, f, g, h | 
| i, j, k, l |  // matrix1 
| m, n, o, p | 
+-   -+ , 

+-   -+ 
| i, j, k, l | 
| m, n, o, p | 
| a, b, c, d | 
| e, f, g, h | 
+-   -+ , 

+-   -+ 
| m, i, e, a | 
| n, j, f, b | // matrix2 
| o, k, g, c | 
| p, l, h, d | 
+-   -+ , 

... 

] 

ように、上部の配列を理解できるように、私の配列は、Aからの手紙の作るものすべて行列のスーパーセットです。上。配列内の一部の行列は重複していると見なされます。水平、垂直、2つの対角線で行列を反転したり、90,180,270度回転させて結果行列を配列に含めると、これらの2つの行列は "重複"とみなされます。たとえば、matrix1を時計回りに90度回転させると、matrix2が得られます。したがって、matrix2とmatrix1は重複していると見なされます。私たちはそのうちの1つだけを必要とします。私の質問は、私の元の配列(削除され、保持されているものは問題ではない、あなたはそのうちの1つを保持する)で重複を削除する最良の(最も簡単な)方法は何ですか?

ありがとうございました。

答えて

1

マトリックスを表現するための「標準的な」方法を定義することをお勧めします。その表現は、互いの回転および鏡である行列が同じ表現を有し、互いの回転および鏡ではないすべての行列が異なる表現を有するという特性を有するべきである。あなたのケースでは、行列のすべての文字が一意であるため、次のように「標準」表現を定義することができます。行列を与え、回転させて反転させて、すべての角文字のうちの最下位文字が左上隅にくるようにします。 2番目に小さい文字(最も小さい文字に隣接する2つのコーナーのうちの1つ)が右上隅に終わります。次に、行列を文字列に「圧縮」します。例えば、(第1の行列である逆さまにひっくり返し次いで時計回りに90度回転させて)

h b d j 
l n f i 
o g a k 
n c p e 

e k i j 
p a f d 
c g n b 
n o l h 

両方は、標準的な表現ekijpafdcgnbnolhを有するであろう。すべての行列を繰り返し処理し、それぞれの標準表現を生成し、それがまだ存在しない場合はHashSetに入れます。標準表現がすでにセットに含まれているすべての行列を破棄します。

+0

良いアイデア、私はそれを試してみましょう。ありがとうございました。 –

関連する問題