leetcode 上有一道以螺旋方向遍歷矩陣的題目https://leetcode.com/problems/spiral-matrix/#/description
題目描述如下:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
像這種遍歷的題一般都是有規(guī)律的,所以要解決這道題我們首先得找出遍歷時坐標的規(guī)律。
設矩陣大小為 m×n.
我們假設當前坐標為 ( i , j )纵装,起始時就是(0, 0)相满,由于是螺旋前進,所以首先向右直到盡頭录择,然后向下拔莱,然后向左,然后向上隘竭,最后又是右塘秦。所以方向上為【右,下动看,左尊剔,上】循環(huán)。
然后我們要考慮菱皆,每個方向的步長是多少:
第一圈:
向右前進 n 步须误。
向下前進 m - 1 步挨稿。
向左前進 n - 1 步。
向上前進 m - 2 步京痢。
第二圈:
向右前進 n - 2 步奶甘。
向下前進 m - 3 步。
向左前進 n - 3 步祭椰。
向上前進 m - 4 步甩十。
... ...
第i圈:
向右前進 n - i + 1步。
向下前進 m - i 步吭产。
向左前進 n - i 步侣监。
向上前進 m - i - 1 步。
將這個前進步長序列整理出來就是:
【n, m -1, n - 1, m -2, n -2, m -3, n -3, ......】
對應的前進方向的序列為:
【右臣淤, 下橄霉, 左, 上邑蒋,右姓蜂,下,左医吊,.........】
整理為代碼如下:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};//RIGHT DOWN LEFT UP
vector<int> res;
int m = matrix.size(); if (m == 0) return res;
int n = matrix[0].size(); if (n == 0) return res;
vector<int> nSteps{n, m-1};
int r = 0;
int c = -1;
int iDir = 0;
while(nSteps[iDir%2]) {
for(int i = 0; i < nSteps[iDir%2];++i) {
r += dirs[iDir%4][0];
c += dirs[iDir%4][1];
cout << "r = " << r << " c = " << c << endl;;
res.push_back(matrix[r][c]);
}
nSteps[iDir%2] --;
iDir ++;
}
return res;
}
};