矩陣的螺旋輸出 Python C 實現

2021-10-24 22:15:38 字數 4018 閱讀 4083

4 寫在最後

給定乙個m*n(m行,n列)的矩陣,以螺旋的順序返回矩陣所有元素。

本文以順時針螺旋為例。 ?

最近在做ccfcsp。但是ccfcsp上沒有這個題,所以這個題是我虛構的。

ccfcsp的題目通常會給出m

mm、n

nn的大小;

然後依次輸入m×n

m×nm×

n二維陣列的元素。

補充:假設0

<

m<

n<

1000

0<

m<

n<10

0 例如說明

輸入輸出

第1行3 3

1 2 3 6 9 8 7 4 5

第2行1 2 3

第3行4 5 6

第4行7 8 9

下面兩種方法,方法一是python實現,方法二是c語言實現。兩種語言用的方法不一樣,請家人們自行選擇**。

按照矩陣的「厚度」迴圈。

即第t次迴圈以t,t為起點以(t+1,t)為終點畫圈,直到將matrix螺旋遍歷完畢;

這種方式理解起來非常簡單,社群裡很多人都寫。

這裡不多做贅述,下面直接放python實現的**。

注:python接收的是乙個二維列表

'''

@author:lyn#reo

@create:2020.10.13

#可以根據需要修改

#如有二次傳送的必要

#請留下修改者和修改日期:)

#感激您的真誠#

'''def

spiralorder()

: d=

0 list=

while

2*d2*dfor j in

range

(d,lenn-d)

:[j]

)for i in

range

(d+1

,lenm-d)

:[lenn-

1-d]

)if lenm-

2*d!=1:

for j in

range

(lenn-d-

2,d-1,

-1):

1-d]

[j])

if lenn-

2*d!=1:

for i in

range

(lenm-d-

2,d,-1

):[d])

d+=1return list

matrix=

eval

(input()

)if matrix!=

: lenn=

len(matrix[0]

) lenm=

len(matrix)

res=spiralorder(

)print

(res)

else

:print([

])

重點來說說方法二

畫出陣列的「地圖」,若碰到地圖的「邊界」已遍歷過的「區域」,就改變「方向」。遍歷結束後退出程式即可;

敲黑板!!!這幾個詞下面要考

順時針旋轉的呈現出規律性

向右遍歷、向下遍歷、向左遍歷、向上遍歷、向右遍歷…

如此往復,如下圖

就如同我們貼左側牆開車,一直右轉

因此只需將遍歷索引寫成順序右轉的即可。

寫程式就如同炒菜,要做一些準備 ?

struct directiongo[4]

=,,,

};d/*定義乙個結構體儲存行徑的方向*/

int t=0;

/*以及乙個全域性變數作為行徑方向的索引,用t++和t%4的方式可以讓行徑方向迴圈*/

char map[n]

[n];

/*地圖用來記錄邊界條件和已訪問過的位置*/

int element[n]

[n];

/*二維陣列矩陣用來儲存題目給出的二維陣列*/

通過索引進入矩陣,首先要將矩陣的當前值帶出來;

其次,既然已經讀取了,就要在地圖上記錄訪問過該點了

將兩句偽**打包寫成乙個函式

void

outtunnelsorder

(int x,

int y)

顯然,我們還要進行判斷

判斷下個要去的矩陣點是否可進入。

如果不能進入要調整行徑方向的索引。

int

jadgedextroversion

(int x,

int y)

//對座標進行判斷

return1;

}

很容易得知,需要進行兩次判斷。

判斷下一次的索引座標是否可以走。若可走,則將索引座標賦給next;若不可走,根據判斷程式會更改座標索引(t++),再將索引座標賦給next;

判斷被賦值的next,若可走,則進行next座標的讀取;若不可走,則說明已經遍歷完畢了,得退出程式。

void

spiralorder

(int x,

int y)

else

}

/*

filename:matrixspiral.c

author:lyn#reo

create:2020.10.18

#可以根據需要修改

#如有二次傳送的必要

#請留下修改者和修改日期:)

#感激您的真誠#

*/#include

#include

#include

#define n 102

/*定義乙個結構體儲存行徑的方向*/

struct directiongo[4]

=,,,

};/*以及乙個全域性變數作為行徑方向的索引*/

int t=0;

int nextx,nexty;

char map[n]

[n];

int element[n]

[n];

intjadgedextroversion

(int x,

int y)

//對座標進行判斷

return1;

}void

outtunnelsorder

(int x,

int y)

void

spiralorder

(int x,

int y)

else

}int

main()

}spiralorder(1

,1);

//從(1,1)進入

return0;

}

文案、**、製作:lyn#reo

由於寫python題的時候,算遍歷的邊界座標讓我算的頭疼,所以我想寫個不用座標來管邊界的程式,但我又不會寫python的實現方法,於是本文就誕生了。

本文只是以順時針為例,逆時針只需要改變go中儲存位置的順序就好了。

思路受啟發於ccfcsp2013-5的用dfs「畫地圖」思路,並不是真正意義上的dfs

它的缺點是空間占用要多使用(4n

+4

)(4n+4)

(4n+4)

的空間介紹地比較深入,仔細看時方便理解,如果覺得我寫的不錯,還請為我點個免費的贊!

祝你變得更強,下次見 ?

輸出螺旋矩陣

螺旋矩陣 是指乙個呈螺旋狀的矩陣,它的數字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此迴圈。如圖1 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 輸出螺旋矩陣 author zhanliqing ...

輸出螺旋矩陣

關於螺旋矩陣的說法不一,這裡指的是形如 21 22.20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 的矩陣。問題有兩個 1.程式設計實現輸出這個矩陣 2.設1點的座標是 0,0 x方向向右為正,y方向向下為正.例如 7的座標為 1,1 2的座標為...

矩陣螺旋輸出

劍指 offer 29.順時針列印矩陣 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。1.用行增量和列增量決定下一步方向 2.到達邊界時,換方向 同時縮小邊界條件 3.當左右邊界,上下邊界重合時了,完成全部遍歷 param matrix return var spiralorder ...