如何順時針列印乙個矩陣的元素呢,例如:如果輸入如下矩陣:
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...