螺旋矩陣(佇列)

2021-08-05 22:12:11 字數 2167 閱讀 2847

有如下矩陣,設1點的座標是(0,0),7點的座標是(-1,-1),2點座標是(0,1),程式設計實現輸入座標值,如(a,b),輸出其相應的值

觀察該矩陣,知道這個矩陣是按順時針螺旋向外擴充套件的,我們可以把它分成一圈一圈的,如下:

現在看看(a,b)會處在第幾圈呢?點2(0,1)在第2圈,點18(-1,-2)在第2圈,所以圈數就等於max(abs(a),abs(b)),即取a,b的絕對值中最大的乙個。且每一圈的最大的那個數為1,9,25。他們之間有什麼規律?

1=1^2  ; 9= 3^2  ;25 =5^2;而1,3,5又和圈數有關,設圈數=c,則他們等於2c+1,所以最大值maxvalue=(2c+1)^2;

最後一步,觀察一下一圈中的上下左右邊的值,他們又是如何計算的呢

我們就以第三圈為例,找到第三圈各邊的基值,因為他們的座標(a,b)中必有乙個為0,方便計算,因此把他們看作基值

對於上邊來說,y是不變的,x在變化,即當y=-2(y=-c)時,23=25+(-2),所以上基值topbase=maxvalue+y,因為上邊的遞增方向是正方向,所以座標對應的值value=topbase+x;

對於右邊來說,x是不變的,y在變化,即當x=2(x=c)時,11=25-14,所以右基值rightbase=maxvalue-7*x,因為右邊的遞增方向是正方向,所以座標對應的值value=rightbase+y;對於下邊來說,y是不變的,x在變化,即當y=2(y=c)時,15=25-10,所以下基值bottombase=maxvalue-5*y,因為下邊的增長方向是負方向,所以value=bottombase-x;

對於左邊來說,x是不變的,y在變化,即當x=-2(x==-c)時,19=25-6,所以左基值leftbase=maxvalue+3*x;左邊增長方向是負方向,所以value=leftbase-x;

**:

int max(int a,int b)

int abs(int a)

int test(int x,int y)

//右邊

else if(x==c)

//下邊

else if(y==c)

//左邊

else

}void main()

}//如果想要逆時針的螺旋矩陣,交換i.j的位置即可

for(i=-4;i<4;i++)

}}

【擴充套件】:

列印如下矩陣a:

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

其實思路差不多,順時針,都是要分成幾圈幾圈來看,第一圈從1到16,第二圈從17到24,再好好研究一下:

拿最外一圈研究,座標(a,b),

int m=1, i=0,j;

上邊,從1到5,a不變,b變

for(j=0;j<5;j++) a[i][j]=m++;

右邊,從6開始到8,a變,b不變,b=4

for(j=i+1;j<4;j++) a[j][4]=m++;

下邊,從10到12,a不變,b變,a=4

for(j=n-i-1;j>i;j--)a[n-i-1][j]=m++;

左邊,從13到16,a變,b不變,b=i

for(j=n-i-1;j>i;j--)a[j][i]=m++;

現在是5*5的矩陣,所以就有5/2圈,

所以就要迴圈5/2次

int m =1 ;

for(i=0;ii;j--)a[n-i-1][j]=m++;

for(j=n-i-1;j>i;j--)a[j][i]=m++;}

if(n%2==1)

螺旋方針(螺旋矩陣)

螺旋方陣 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 ...

列印螺旋矩陣

首先,看一下螺旋矩陣的樣子.如下圖 求螺旋陣列的 如下 dev cpp平台 include using namespace std int alloc mat int round 動態二維陣列的分配 void del mat int mat,int round 刪除動態分配的二維陣列 void pr...