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 ...