2017-02-23 45 views
2

我打印出一個6x6 1d數組,但想逆時針旋轉左上方的3x3部分。有沒有這樣的算法?在未來,我也想旋轉像右下方的3×3節或右上方的3×3節或左下方的3×3節。如何在C中旋轉1d數組的一部分?

a[0] a[1] a[2] a[3] a[4] a[5]   a[1] a[2] a[8] a[3] a[4] a[5] 
a[6] a[7] a[8] a[9] a[10] a[11]  a[0] a[7] a[14] a[9] a[10] a[11] 
a[12] a[13] a[14] a[15] a[16] a[17] ---> a[6] a[12] a[13] a[18] a[19] a[20] 
a[18] a[19] a[20] a[21] a[22] a[23]  a[18] a[19] a[20] a[21] a[22] a[23] 
a[24] a[25] a[26] a[27] a[28] a[29]  a[24] a[25] a[26] a[27] a[28] a[29] 
a[30] a[31] a[32] a[33] a[34] a[35]  a[30] a[31] a[32] a[33] a[34] a[35] 
+1

3x3是一種特殊情況,因爲中間條目不會移動。你能告訴我們在4x4情況下會發生什麼嗎? –

+1

如果它只是*左上角的3x3矩陣,您可以這樣做嗎?如果不是這可能是一個好的第一步,學習如何做的最好方法就是在紙上做。當你得到它在紙上工作,然後有一個4×4的矩陣,並做左旋3×3部分與這個小矩陣「旋轉」。當你可以用4x4矩陣完成時,你應該可以將它應用到任何MxN矩陣(其中M> 3和N> 3)。當你可以在紙上做時,試着將算法改進爲簡單的小步驟和離散步驟。最後將這些小步驟轉化爲代碼。 –

+0

你可能不想計算預旋轉和後旋轉索引之間的九個差異數組:'diff [] = {0-1,1-2,2-8,6-0,7-7,.. }'。一旦選擇了要旋轉的子陣列,就可以獲得該子陣列中的索引數組(例如,'ix [] = {'8,'9,10,24,25,26,30,31,32}每個'k'都用'a [k + diff [k]]'交換'a [k]'。 (_somehow_部分意味着它只是一個純粹的想法,而不是解決方案。) – DyZ

回答

1

這裏很重要的一點是要區分事物如何在內存中分配以及如何表示它們。沒有像「6x6 1D數組」那樣的東西,因爲1D數組沒有行和列。所以,先把這個一維數組轉換成一個二維數組6x6。

然後,您可以通過指定座標(x,y)來定義旋轉中心。您應該理智地檢查這些座標,以使它們不在矩陣的邊緣(或者,設計算法以便在需要時可以這樣做)。


鈍的解決辦法是隻獲取圍繞中心的索引,並在硬編碼方式來回移動數據:

array[center_x-1][center_y-1] = array[center_x][center_y-1]; 
... 

等。這將是最快的方法,最簡單的解決方案往往是最好的。


允許可變旋轉方向的更模塊化方法是創建一個指針數組,指向需要旋轉的中心周圍的數據。指針數組可以實現爲鏈表的簡單形式:

typedef struct rotate_node_t rotate_node_t; 
typedef struct rotate_node_t 
{ 
    rotate_node_t* next; 
    rotate_node_t* prev; 
    int* data; 
} rotate_node_t; 

你得這可能將它的指標分配爲rotate_node_t rotation [8]

0 1 2 
7 c 3 
6 5 4 

其中「c」爲中心。

有了這個,您可以簡單地在任意方向上遍歷鏈表並將數據從一個節點移動到另一個節點。它比直接數組訪問更靈活,但速度更慢,更復雜。它可以擴展爲支持所有方式的旋轉模式。