如何列印矩陣

2022-09-16 01:51:10 字數 3186 閱讀 6370

如何順時針列印乙個矩陣的元素呢,例如:如果輸入如下矩陣:

1              2              3              4

5              6              7              8

9              10           11           12

13           14           15           16

則依次列印出數字:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10

。思路:用類似深度搜尋的方法來做,每次朝乙個方向走,如果不能再走了順時針轉向。

int array[1000][1000

];int canuse[1000][1000

];int step[4][2] = , , , };

void scan(int x, int y, int direct, int m, int

n)

}

}int

main()

}

scan(

0, 0, 0

, m, n);

printf("\n

");}

如何沿對角線方向迂迴遍歷乙個矩陣的元素呢,例如:如果輸入如下矩陣:

1              2              3              4

5              6              7              8

9              10           11           12

13           14           15           16

則依次列印出數字:1, 2, 5, 9, 6, 3, 4, 7, 10, 13, 14, 11, 8, 12, 15, 16

思路:同一連線上的點,其座標x+y必然都相等

偶數次(從0開始計數)沿右上方向運動;奇數次則沿左下方向運動。

int

main()

}

for (i = 0; i < m + n; i++)

} else

}

}

printf("\n

");}

下面是乙個螺旋佇列:

73   74   75   76   77   78   79   80  81

72   43   44   45   46   47   48   49   50

71   42   21   22   23   24   25   26   51

70   41   20    7     8     9

10   27   52

69   40   19    6   1

2    11   28   53

68   39   18    5     4     3    12   29   54

67   38   17   16   15   14   13   30   55

66   37   36   35   34   33   32   31   56

65   64   63   62   61   60   59   58   57

看清以上數字排列的規律,設1點的座標是(0,0),x方向向右為正,y方向向下為正。例如:7的座標為(-1,-1),2的座標為(1,0),3的座標為(1,1)。程式設計實現輸入任意一點座標(x,y),輸出所對應的數字;或輸入任意數字,輸出該數字的座標。

解析:規律能看出來,問題就在於如何利用它。很明顯這個佇列是順時針螺旋向外擴充套件的,我們可以把它看成一層一層往外延伸。第 0 層規定為中間的那個 1,第 1 層為 2 到 9,第 2 層為 10 到 25,注意到 1、9、25、……不就是平方數嗎?而且是連續奇數(1、3、5、……)的平方數。這些數還跟層數相關,推算一下就可以知道第 t 層之內一共有 (2t-1)^2 個數,因而第 t 層會從 [(2t-1)^2] + 1 開始繼續往外螺旋。給定座標 (x,y),如何知道該點處於第幾層?層數 t = max(|x|,|y|)。

知道了層數,接下來就好辦多了,這時我們就知道所求的那點一定在第 t 層這個圈上,順著往下數就是了。要注意的就是螺旋佇列數值增長方向和座標軸正方向並不一定相同。我們可以分成四種情況——上、下、左、右——或者——東、南、西、北,分別處於四條邊上來分析。

東|右:x == t,佇列增長方向和 y 軸一致,正東方向(y = 0)數值為 (2t-1)^2 + t,所以 v = (2t-1)^2 + t + y

南|下:y == t,佇列增長方向和 x 軸相反,正南方向(x = 0)數值為 (2t-1)^2 + 3t,所以 v = (2t-1)^2 + 3t - x

西|左:x == -t,佇列增長方向和 y 軸相反,正西方向(y = 0)數值為 (2t-1)^2 + 5t,所以 v = (2t-1)^2 + 5t - y

北|上:y == -t,佇列增長方向和 x 軸一致,正北方向(x = 0)數值為 (2t-1)^2 + 7t,所以 v = (2t-1)^2 + 7t + x

其實還有一點很重要,不然會有問題。其它三條邊都還好,但是在東邊(右邊)那條線上,佇列增加不完全符合公式!注意到東北角(右上角)是本層的最後乙個數,再往下卻是本層的第乙個數,那當然不滿足東線公式啊。所以我們把東線的判斷放在最後(其實只需要放在北線之後就可以),這樣一來,東北角那點始終會被認為是北線上的點。

下面給出第 t 層的圖示說明:

螺旋佇列問題

#include

using

namespace

std;

#define max(a,b) ((a)>(b) ? (a) : (b))

#define abs(a) ((a)>0 ? (a) : -(a))

#define square(a) ((a)*(a))

//輸入座標,輸出對應的數字

int spiral_queue(int x, int

y)

intmain()

return

0;

}

旋轉列印矩陣 旋轉儲存矩陣 之字形列印矩陣

題目 輸入乙個矩陣,按照從外向裡以順時針順序依次列印出每乙個數字。例如 如果輸入如下矩陣 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 有三問 1 如何實現轉圈列印矩陣?2 如何實現順時針旋轉矩陣?3 如何實現 之 字形列印矩陣?題外話 由於要列印輸出矩陣,從題目可以...

轉圈列印矩陣以及之字列印矩陣

這兩道題目的目的就是訓練我們應該由巨集觀排程的概念,切不可注重於區域性的變化。相同點 a 這些題沒告訴你怎麼做好,告訴你不能怎麼做。不能想下標怎麼變化!b 先要確定好巨集觀排程,然後其他的都是簡單函式 題目 給定乙個整型矩陣matrix,請按照轉圈的方式列印它。例如 1 2 3 4 5 6 7 8 ...

列印螺旋矩陣

首先,看一下螺旋矩陣的樣子.如下圖 求螺旋陣列的 如下 dev cpp平台 include using namespace std int alloc mat int round 動態二維陣列的分配 void del mat int mat,int round 刪除動態分配的二維陣列 void pr...