給定乙個自然數n,列印1-n之間所有的數,要求:按螺旋形狀順時針列印。以前看到過這道題,說的是從外向內螺旋列印,而前幾天又看到乙個變種,由內向外列印。比之前的稍微難一點,趁週末閒著沒事,總結一下。先上兩幅圖,大家看一下效果。
這兩種輸出方法,其實大同小異,道理都差不多,會了一種,則另一種不難,先看從外向內列印的
最簡單且直觀的方法就是k * k的二維陣列儲存數字,先將數字按照要求填入陣列,然後輸出整個陣列即可
對於n個數而言,令k = ceil(sqrt(n)), 則分配k*k的二維陣列即可。比如n = 5時,分配3*3的陣列即可。
以左上角為起始點
用乙個整數flag來標識方向
flag = 1 - 向右
flag = 2 - 向下
flag = 3 - 向左
flag = 4 - 向上
當到達邊界的時候應該變換方向,即向右轉,如何判斷邊界?我的方法是,將所有陣列元素初始化為-1,則有如下兩種情況
1.下標超出二維陣列邊界,則需轉向(注意,轉向之前下標需要退回一格)
2.下標未越界,但下乙個位置的值不是-1,那麼說明它被填充過,也需轉向。
重複以下過程直到所有資料填充完畢。
1. 從左至右填充陣列,如遇右邊界或者下一位置已經被填充過,則改變方向,轉入步驟2
2. 從上至下填充陣列,如遇下邊界或者下一位置已經被填充過,則改變方向,轉入步驟3
3. 從右至左填充陣列,如遇左邊界或者下一位置已經被填充過,則改變方向,轉入步驟4
4. 從下至上填充陣列,如遇上邊界或者下一位置已經被填充過,則改變方向,轉入步驟1
整個填充過程如下圖
有了以上思路,則寫**不是難事
如果上面的搞懂了,則這個也就不難了,不過有一些細節上的東西還需修改一下
由於是從內向外填充,所以起始位置不再是(0, 0),需要重新計算,而且還與二維陣列的階數k的奇偶性相關
1 當k為奇數時,起始位置為(k / 2, k / 2),如下:
k = 3,起始位置為(1, 1)
7 8 9
6 1 2
5 4 3
2 當k為偶數時,起始位置為(k / 2 - 1, k / 2 - 1),如下:
k = 4,起始位置為(1, 1)
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
與從外向內填充不同的是,邊界判斷中不會再出現下標越界的情況,只需判斷當前位置是否填充過即可
從內向外填充時,能轉向時優先轉向,不能轉向時才繼續向前填充,而從外向內填充則恰恰相反,無法繼續向前填充時才轉向。
Scala趣味程式設計 列印古詩歌
上次用scala做了一道數學題,今天我們來列印一下古詩,你會發現函式式程式設計在資料處理中的妙用,居然只用一行 就搞定了,不要太爽。我們列印的列印函式要實現將輸入的橫排詩歌列印成從右到左的豎排版。例如 故人西辭黃鶴樓烟花三月下揚州孤帆遠影碧空盡唯見長江天際流 列印成 唯 孤 煙 故 見 帆 花 人 ...
列印螺旋矩陣
首先,看一下螺旋矩陣的樣子.如下圖 求螺旋陣列的 如下 dev cpp平台 include using namespace std int alloc mat int round 動態二維陣列的分配 void del mat int mat,int round 刪除動態分配的二維陣列 void pr...
陣列螺旋列印
package su.interview import utils.com.matrixer 螺旋列印數列 author toy public class array 01 j i 南 system.out.println b i j for int k 0 k n 1 k i j 西 system...