有趣的演算法(九) 蛇形陣列

2022-10-10 17:45:09 字數 1086 閱讀 9960

有趣的演算法(九)——蛇形陣列

一、問題闡述

給定乙個數字,需要返回的內容如下圖所示:

輸入5,得到結果:

輸入10,得到結果:

輸入乙個數字i,輸出結果的矩陣是i行i列的。矩陣從右上角開始,從1開始往下,每增加1行加1。到第i行後,再往左,每左一列加1。到頭後再往上、往右、再往下....,其中已經填上的數字不能覆蓋,直接轉向。因為其生成的過程類似盤旋的蛇,故稱為蛇形陣列。

現要求輸入任意元素i,返回矩陣內容。

二、問題分析

初看問題,看似很簡單,用幾個迴圈就可以解決問題。但是,當真正開始寫迴圈的時候,就容易卡住。

對於此問題,用迴圈解決,需要考慮邊界條件,以及如何進行迴圈。

1)如何進行迴圈

根據蛇形陣列的生成過程,由左上方開始迴圈。共需要四類的迴圈,從左上到下、從下右到左、從左下到上、從上左到右,其中的上下左右都是相對的位置。

2)邊界問題

迴圈何時退出,主要有兩點:1是不能超過邊界,輸入的是i,則元素不能超出i;2是不能覆蓋原有的內容,所以可以在對每個元素進行賦值的時候進行判斷,如果已經有內容,則直接轉向。

當觸及邊界問題,則按照第一點提到的四種迴圈,按順序執行。

3)迴圈結束條件

上述的四個迴圈,只能完成一次的矩陣內容填充,故還需要乙個總的迴圈。考慮到輸入i,結果陣列的元素個數是i*i,故迴圈結束的條件就是當值大於i*i,則結束迴圈。

三、實現

php實現過程如下:

function snakenumber($level)

}結果如問題闡述中的圖示。其中的核心就是四重的迴圈,並且以結果不能大於 $level * $level作為邊界控制條件。

php的實現相對來說簡易,如果要用j**a等強型別語言來實現的時候,需要先初始化整個二維陣列。初始化的時候,給每個元素賦值為0,然後php中判斷元素是否賦值的**段!isset($res[$row+1][$column]),換成相應的$res[$row+1][$column]==0,即可作為判斷。其餘**類似,不再贅述。

另外,近期個人事務較多,故文章發布較少,預計元旦開始會逐步恢復正常的內容發布。

——written by linhxx 2017.10.31

snakeShape 蛇形陣列

在師兄的督促下實現的蛇性陣列,用了最簡單的辦法,最開始還懷疑能不能實現,結果還真的可以.snakeshape.cpp input n include using namespace std int main int flag 1 int first index 0,second index n 1,...

C 蛇形陣列

例如 void print arr int arr2 n n 列印陣列 printf n sleep 200 sleep函式,使程式暫停200毫秒 system cls cls,清除螢幕中列印出來的內容 void order print int arr n n int circle 按順序列印 再定...

S字蛇形陣列賦值

問題描述 輸入乙個整數,作為二維陣列的行列,將二維陣列中的值賦值成s蛇形。input m 5 output 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 有人用演算法直線過,但是我覺得推出那個公式還真複雜啊,我的方...