螺旋矩陣演算法

2021-09-05 23:53:05 字數 1995 閱讀 3761

記得這是大二時,我的老師給我出的題,回去琢磨了半天,感覺不是很難。今天整理電腦裡的資料時發現了,拿出來看看,上網搜搜發現面試題裡挺多的,但網上的看起來比我的複雜得多(也許是個人感覺,我比較另類),所以拿出來分享。時間複雜度基本上就是o(n^2)了。

這個螺旋矩陣有幾類,我當時拿到的題是從中間往外順時針旋轉,如下所示:

7 8 9

6 1 2

5 4 3

這個太小不好分析規律,來個大的:

看出規律沒?找張草稿紙研究研究。

我當時是這麼想的:

紅線方程y=x,綠線方程y=-x+4,4為矩形邊長。

兩條直線將區域分為四個部分,劃分好每個區域的邊界值,每個區域的座標變化規律有四種,x++,y++,x--,y--,接下來仔細分析就能得到演算法:

void spiralarray(int size, int** ar)

else if (x>a-y-1&&x>y)

else if (x>a-y-1&&x<=y)

else if (x<=a-y-1&&x應該看得懂吧,下面是完整**:

#include#includeusing namespace std;

void spiralarray(int size, int** ar)

else if (x>a-y-1&&x>y)

else if (x>a-y-1&&x<=y)

else if (x<=a-y-1&&x>n;

if (n==0)break;

int a=n/2*2+1;//保證邊長為奇數

int **g=new int *[a];

for (int i=0;i>c;

if ('n'==c)continue;

int ws=2;

if (n*n/100>=1)

ws=4;

else if (n*n/10>=1)

ws=3;

for (int y=0;y還有一類螺旋矩陣是從外往裡的,如下圖:

只要稍微改動就可以了,分析如下:

賦值的順序和演算法的原理不變,從大數開始賦值因此for迴圈改為:for(int i=size*size;i>=1;i--),這時的結果為:

對稱軸為x=a-x-1,帶入即可。另外,這種矩陣不存在奇偶數不相同的問題。完整**如下:

#include#includeusing namespace std;

void spiralarray(int size, int** ar)

else if (x>a-y-1&&x>y)

else if (x>a-y-1&&x<=y)

else if (x<=a-y-1&&x>n;

if (n==0)break;

int a=n;

int **g=new int *[a];

for (int i=0;i>c;

if ('n'==c)continue;

int ws=2;

if (n*n/100>=1)

ws=4;

else if (n*n/10>=1)

ws=3;

for (int y=0;y

else

}cout<

} for (i=0;i

delete[a] g;

g=null;

}while (1);

return 0;

}

螺旋矩陣演算法

螺旋輸出1 25 public class sequence if row n col n row 1 col 1 array row n col 0 for int i 0 i n i system.out.println 矩陣轉換 public class testarray 建立乙個4行3列的...

螺旋方針(螺旋矩陣)

螺旋方陣 time limit 1000ms memory limit 65536kb problem description 的螺旋方陣當n 5和n 3時分別是如下的形式 請給出乙個程式,對於任意的輸入 0 11 輸出按照上面規律所獲得的 的螺旋方陣。input 輸入第一行為整數 0 10 代表有...

螺旋矩陣 蛇形矩陣

問題描述 給定乙個包含m行n列的m x n矩陣,程式設計按照螺旋順序,輸出該矩陣中的所有元素。輸入有多個矩陣。每個矩陣資料的第1行有兩個整數m和n,接著是乙個mxn矩陣的描述,有m行,每行有n個整數 輸出對每個矩陣資料,按照螺旋順序輸出矩陣陣列的元素。輸入樣例 3 31 2 3 4 5 6 7 8 ...