2011-03-08 75 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最佳。陣列中的某些矩陣被認爲是重複的。如果通過兩個對角線水平,垂直地翻轉矩陣,或將它旋轉90,180,270度並且結果矩陣包含在我的數組中,則這兩個矩陣被認爲是「重複的」。例如,如果將matrix1順時針旋轉90度,則會得到matrix2。所以matrix2和matrix1被認爲是重複的。我們只需要其中一個。我的問題是,什麼是最好的(最簡單的)方法來刪除我的原始數組中的副本(哪一個被刪除,哪一個被保留不是問題,你只保留其中之一)?

謝謝。

回答

1

我建議你定義一些代表矩陣的「標準」方式。該表示應該具有這樣的性質,即彼此的旋轉矩陣和鏡像具有相同的表示,並且所有不是旋轉的矩陣和彼此的鏡像具有不同的表示。由於矩陣中的所有字母在您的情況下都是唯一的,因此您可以按如下方式定義「標準」表示:給定矩陣,旋轉並翻轉它,以便所有角落字母中的最低字母結束於左上角,並且第二個最低的字母(在與最小的字母相鄰的兩個角落之間)結束於右上角。然後,將矩陣「壓縮」成一個字符串。例如,既

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 

(其是第一矩陣順時針旋轉90度,然後上下顛倒)將具有標準表示ekijpafdcgnbnolh。您現在可以迭代所有矩陣,爲每個矩陣生成標準表示,並將其放入HashSet(如果它尚未存在)。丟棄集合中已存在標準表示的所有矩陣。

+0

好主意,我會試試看。謝謝。 –