螺旋陣列
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
分析:這是乙個一維維度和二維維度相等的陣列arr[len][len],將num=1開始從arr[0][0]賦值,直到num=len*len結束賦值。在賦值過程中,如果遇到
下乙個位置超出陣列長度或者已經被賦值,則需要改變方向。
步驟解析:
1.首先定義乙個二維陣列,並將陣列初始化為0(初始化為0方便後面判斷有沒有被賦值)
5
int len =0;
6printf
("請輸入陣列長度:");
7scanf
("%d"
,&len);8
int arr[len]
[len];9
int i =0;
10int j =0;
11for
(;i)
2.對陣列賦值
從arr[0][0]的位置開始賦值,那麼該如何確定轉彎的位置及方向呢?我們可以初始化乙個dir = 0 用dir%4來確定賦值的方向
(0:向右,1:向下,2:向左,3:向上)。可以確定的是賦值是從arr[0][0]的位置開始向右執行,當右邊的位置超出陣列長度或者已經被賦值
(a[i][j]!=0)時,dir++,此時dir=1,dir%4=1,方向變為向下。
1 i =0;
2 j =0;
3int dir =0;
//確定移動方向 dir%4 == 0向右 1向下 2向左 3向上
4int num =1;
5while
(num<=len*len)
30break
;
上面為向右是的情況,其他三種情況同理。
完整**:
1 #include23
intmain()
15}16 i =0;
17 j =0;
18int dir =0;
//確定移動方向 dir%4 == 0向右 1向下 2向左 3向上
19int num =1;
20while
(num<=len*len)
30break;31
32case1:
//向下
33 i++;34
if(i+
1==len||arr[i+1]
[j]!=0)
37break;38
39case2:
//向左
40 j--;41
if(j-
1<
0||arr[i]
[j-1]!=
0)44break;45
46case3:
//向上
47 i--;48
if(i-
1<
0||arr[i-1]
[j]!=0)
51break;52
}5354}
55for
(i=0
;iprintf
("\n");
60}61printf
("\n");
62return0;
63}
結果演示:
基於c語言實現螺旋矩陣
首先我們要清楚螺旋矩陣的內涵,即所謂 螺旋方陣 是指對任意給定的n,將1到n n的數字從左上角第1個格仔開始,按順時針螺旋方向順序填入n n的方陣裡。最基本的就是定義乙個二維陣列,對其進行向右 向下 向左 向上的依次迴圈。1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 1...
(PAT乙級)1050 螺旋矩陣(C語言實現)
總結 1 兩個會卡住的思路難點 n,m的值怎麼確定。怎麼列印螺旋矩陣。對於 我本來的想法是找出n的所有約數,然後再在約數裡面找到差值最小對應的n,m。這樣步驟繁雜,又要先找約數,然後又要判斷最小值是哪兩個數的差。其實約數裡面是有對應的,比如 12的約數 1,2,3,4,6,12 其中1 12 3 4...
C語言實現動態陣列
include include 要使用malloc是要包含此標頭檔案 include 要使用memset是要包含此標頭檔案 intmain for i 0 i 列印陣列 free p 釋放記憶體,malloc和free一定要記得成組使用,不然會導致程式吃記憶體 getchar 讓程式停頓,觀察輸出 ...