由內向外的迴旋矩陣研究
題目描述:矩陣從內到外按順時針旋轉的方向遞增,如下所示:
矩陣1(4x5)
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
矩陣2(5x5)
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
本演算法旨在研究通過矩陣的行數,列數以及編號求出該編號在矩陣中的位置,如上述矩陣1中5的位置是(2,1),矩陣2中5的位置為(3,1),當然借助本演算法就可以對這種型別的迴旋矩陣做任何處理。
推理過程:
1.首先,我們發現該矩陣無論是有多少行,多少列,他都有乙個東西是不變的,那就是它的拐點處的數值,如下所示(說明:→:表示向右拐;←:表示向左拐;↑:表示向上拐;↓:表示向下拐):
1→ 2↓ 3← 5↑ 7→ 10↓ 13← 17↑……,我們發現拐點處的數字遵循一定的規律,我們對其進行數學歸納法,發現其是符合下列程式的數列:
a(n) = [ (n-1)(n+2)/4] + 1 - [(n-1)/4] ;(其中 [ (n-1)(n+2)/4]表示不大於(n-1)(n+2)/4的整數,[ (n-1)/4]表示不大於(n-1)/4的整數)
2.然後,我們不難發現,所有的拐點都是按照 → ↓ ← ↑的順序迴圈進行的,也就是說4個為一組進行變換,我們還發現組與組之間存在著一種對應關係,假設編號1的拐點在矩陣
中的位置為(x,y),則有如下對應關係:
第0組 第1組 ... 第n組
→ (x,y) (x-1,y-1) ... (x-n,y-n)
↓ (x+1,y) (x+1+1,y-1) ... (x+1+n,y-n)
← (x+1,y+1) (x+1+1,y+1+1) ... (x+1+n,y+1+n)
↑ (x-1,y+1) (x-1-1,y+1+1) ... (x-1-n,y+1+n)
而我們很容易求出編號為1的拐點在矩陣中的位置,假設矩陣為row行col列,那麼1的位置為((row-1)/2 , (col-1)/2)
3.設想,如果我們將所求編號放入拐點數列中,那麼我們就能知道該編號位於哪個拐點之後,也可以知道該拐點的拐向及該編號距離該拐點
的偏移量,我們先求出這個拐點在矩陣中的具體位置,然後通過拐點的拐向及該方向的偏移量就可以求出該編號在矩陣中的具體位置。
4.程式**如下:
螺旋列印 由內向外旋
螺旋列印 include stdafx.h include include include int getcreatematrix int nvectors void spinnerprint int matrix,int n,int nvectors int main int argc,char ...
由內向外順時針旋轉佇列 逆時針旋轉佇列
如下 include using namespace std int max int n1,int n2 int abs int x int spiral int x,int y 根據座標得出當前值 else if x c 左邊 else if y c 下邊 else 右邊 x c void spi...
關於迴旋矩陣的幾點思考 (陣列 不使用陣列)
關於迴旋矩陣的幾點思考 陣列 不使用陣列 某日,友人出題,要求 n n的迴旋矩陣的輸出。迴旋矩陣,顧名思義,就是從外圈數字由大到小旋轉到內圈的n階矩陣 例如 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 便是乙個5...