思考算法題 之二維數(shù)組旋轉(zhuǎn)90度, 180度, 270度

有二維數(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é)公式的方法, 處理這道題


旋轉(zhuǎn)后的第一行

既然, 每行的最后一列, 會(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ī)律

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冗疮,一起剝皮案震驚了整個(gè)濱河市慈俯,隨后出現(xiàn)的幾起案子姥卢,更是在濱河造成了極大的恐慌逗噩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桌硫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啃炸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铆隘,“玉大人,你說我怎么就攤上這事南用“蚰疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵裹虫,是天一觀的道長(zhǎng)肿嘲。 經(jīng)常有香客問我,道長(zhǎng)筑公,這世上最難降的妖魔是什么雳窟? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮匣屡,結(jié)果婚禮上封救,老公的妹妹穿的比我還像新娘拇涤。我一直安慰自己,他們只是感情好誉结,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布鹅士。 她就那樣靜靜地躺著,像睡著了一般惩坑。 火紅的嫁衣襯著肌膚如雪掉盅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天以舒,我揣著相機(jī)與錄音趾痘,去河邊找鬼。 笑死稀轨,一個(gè)胖子當(dāng)著我的面吹牛扼脐,可吹牛的內(nèi)容都是我干的岸军。 我是一名探鬼主播奋刽,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼艰赞!你這毒婦竟也來了佣谐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤方妖,失蹤者是張志新(化名)和其女友劉穎狭魂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體党觅,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雌澄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杯瞻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐牺。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖魁莉,靈堂內(nèi)的尸體忽然破棺而出睬涧,到底是詐尸還是另有隱情,我是刑警寧澤旗唁,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布畦浓,位于F島的核電站,受9級(jí)特大地震影響检疫,放射性物質(zhì)發(fā)生泄漏讶请。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一屎媳、第九天 我趴在偏房一處隱蔽的房頂上張望夺溢。 院中可真熱鬧抹蚀,春花似錦、人聲如沸企垦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春缕坎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妈倔。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工及志, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朵诫。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓辛友,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親剪返。 傳聞我的和親對(duì)象是個(gè)殘疾皇子废累,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359