有二維數(shù)組 ary = [[1, 2, 3], [4, ,5, 6], [7, 8, 9]]; ?
展開時(shí)如下 : [
????????????????????? ? [1, ? ?2, ? 3], ?
?????????????????????? ?[4, ? ?5, ? 6],
?????????????????????? ?[7, ? ?8, ? 9],
????????????????????]
讓這個(gè)數(shù)組旋轉(zhuǎn)90°, 他就變成了?ary90 = [[3, 6, 9], [2, ,5, 8], [1, 4, 7]];
展開時(shí)如下 : [
????????????????????? ? [3, ? ?6, ? 9], ?
?????????????????????? ?[2, ? ?5, ? 8],
????????????????????????[1, ? ?4, ? 7],
????????????????????]
如何旋轉(zhuǎn)呢, 有兩種方法, 一種是算法旋轉(zhuǎn), 另一種是規(guī)則旋轉(zhuǎn), 先講講算法旋轉(zhuǎn).
先看ary的展開樣式, 我們定義橫著的坐標(biāo)為 X, 豎著的坐標(biāo)為 Y. X和Y都從 0 開始
所以 1 的坐標(biāo)是 (0, 0)?
展開時(shí)如下 : [
????????????????????? ? [1 (0,0), ? ?2 (1, 0), ? 3 (2, 0) ], ? 第一行, Y固定為0, X分別是1,2,3
?????????????????????? ?[4 (0, 1), ? ?5 (1, 1), ? 6 (2, 1) ],? ?第二行, Y固定為1, X分別是1,2,3
????????????????????????[7 (0, 2), ? ?8 (1, 2), ? 9 (2, 2) ],? ?第三行, Y固定為2, X分別是1,2,3
????????????????????]
這時(shí), 我們得到了 任意一個(gè)數(shù)值的坐標(biāo) (x, y)
旋轉(zhuǎn)后的坐標(biāo)是 (newX, newY)
newX = y;?
newY = xc - x; ? xc是數(shù)值所在行, 最大索引數(shù). 因?yàn)槭欠叫尉仃? 所以每行數(shù)值是一樣的, 應(yīng)該是ary[i].count - 1, 當(dāng)前值為2
xc = 2;
//取任意值 3, 他的坐標(biāo) (2, 0):
x = 2;
?y = 0;?
newX = y;?
newY = 2 - x;?
即使得出newX = 0; newY = 0;
3 在旋轉(zhuǎn)90度后的坐標(biāo)為 (0, 0)
這個(gè)公式是怎么來的呢, 我講解一下我當(dāng)時(shí)的思路. 先取任意值 1 (x = 0, y = 0). 然后觀察, 旋轉(zhuǎn)后, 1將會(huì)變成什么, 他會(huì)變成(x = 0, y = 2). 以此類推, 看2和3. ?原先是橫著的, 變?yōu)樨Q著了, 所以原先的Y值, 肯定跟新的X值有關(guān)系. 原先的X值, 跟新的Y值有關(guān)系. Y = 0的, 都變成了 X = 0的. ?橫著第一行的, 都變成了豎著第一列的. Y = 1的, 都變成了X = 1的, 橫著第二行的, 都變成了豎著第二列的;
原先的X, 小的, 會(huì)變大. X大的, 會(huì)變小. 0 -> 2, 2 -> 0, 存在逆向關(guān)系, 就是說 newY = Max - X
得出結(jié)論,
原先的Y值, 會(huì)變成新的X值.?
原先橫著的最大索引, 減去X, 會(huì)變成新的Y
(x, y) -> (y, (Max - x))?
以上就是在數(shù)學(xué)的模型下的算法推導(dǎo).
然后再回歸到現(xiàn)實(shí), 循環(huán)數(shù)組. 有兩種方式, 嵌套循環(huán), 或者 一次循環(huán), 這里先說嵌套.
for (int?i = 0;?i?< ary.count; i++) {
????for (int?j = 0;?j?< ary[i].count; j++) {
????????print( ary[i][j] );
? ??}
}
循環(huán)里, 分別用了i跟j, i跟j,又是如何對(duì)應(yīng) 上面數(shù)學(xué)公式里的x和y呢.
第一層循環(huán) i, 實(shí)際上是豎著循環(huán)的, 所以i 對(duì)應(yīng) 的是y.
第二層循環(huán), 實(shí)際上是橫著循環(huán)的, 所以j對(duì)應(yīng)的是x.
所以ary[i][j] 就相當(dāng)于 ary[y][x]
那么在ary90中, 新的位置應(yīng)該是多少呢. 那么就用上述公式
ary90[newY][newX] = ary[y][x]
newX = y;
newY = Max - x
ary90[Max - x][y] = ary[y][x]
Max = ary[y].count - 1
下面在說一下一次循環(huán), 我們擬定確實(shí)是二維數(shù)組, ary中不會(huì)為空, 不會(huì)越界.
int H =?ary.count;//(行)
int L = ary[0].count;//(列)
for (int i = 0; i < H * L; i++?){
? ? int value = ary[i / H][i % L]
}
最后再講一下, 不用數(shù)學(xué)公式的方法, 處理這道題
既然, 每行的最后一列, 會(huì)變成新的第一行, 那么就循環(huán)取出每列的最后一個(gè), 放到新數(shù)組的第一行.
每列倒數(shù)第二個(gè)元素, 會(huì)變成新數(shù)組的第二行, 就以此類推. 直到每列第一行成為新數(shù)組的最后一行為止
Ary *newAry = new Ary
? ? intH = ary.count;
? ? intL = ary[0].count;
? ? for(inti = L -1; i >=0; i--) {
? ? ? ?Ary *tempAry = new Ary
? ? ? ? for(intj =0; j < H; j++) {
? ? ? ? ? ? tempAry.add( ary[j][i] );
? ? ? ? }
? ? ? ? newAry.add( tempAry );
? ? }
按照上述分析過程
旋轉(zhuǎn)180度
?(x, y) -> (xc - x, xc - y)
旋轉(zhuǎn)270度
?(x, y) -> (yc - y,?xc - x)
無論怎么旋轉(zhuǎn), 都是先看中一個(gè)數(shù), 再看他去哪個(gè)位置. 比如
1 (0, 0) ->?(2, 2)
2 (1, 0) -> (2, 1)
3 (2, 0) -> (2, 0)
然后找規(guī)律