#include<iostream>
#include<vector>
using namespace std;
vector<int> spiralOrder(vector<vector<int>> &matrix) {
vector<vector<int>> dirs{ {0,1},{1,0},{0,-1},{-1,0} };//逆时针用此行
/*
方向矩阵(0,1)向右;(1,0)向下;(0,-1)向左;(-1,0)向上;
通过调整次序可实现顺时针和逆时针的遍历。
调为逆时针如下:
*/
//vector<vector<int>> dirs{ {1,0},{0,1},{-1,0},{0,-1} };//顺时针用此行
vector<int> res;
int nr = matrix.size();
if (nr == 0)
return res;
int nc = matrix[0].size();
if (nc == 0)
return res;
int nSteps[2] = { nc,nr - 1 };//逆时针用此行
//int nSteps[2] = { nr,nc-1 };//顺时针用此行
int iDir = 0;
int ir = 0, ic = -1;//逆时针用此行
//int ir = -1, ic = 0;//顺时针用此行
while (nSteps[iDir % 2])
{
for (int i = 0; i < nSteps[iDir % 2]; ++i)
{
ir += dirs[iDir][0];//行增减
ic += dirs[iDir][1];//列增减
res.push_back(matrix[ir][ic]);
}
nSteps[iDir % 2]--;//相应的行数或者列数减一
iDir = (iDir + 1) % 4;//改变方向,转为下一方向。
}
return res;
}
void main()
{
vector<vector<int>> V;
V = { {1,2,3},{4,5,6},{7,8,9}};
vector<int> R;
R= spiralOrder(V);
for (int i = 0; i < R.size(); i++)
cout << R[i]<<',';
}
#include<vector>
using namespace std;
vector<int> spiralOrder(vector<vector<int>> &matrix) {
vector<vector<int>> dirs{ {0,1},{1,0},{0,-1},{-1,0} };//逆时针用此行
/*
方向矩阵(0,1)向右;(1,0)向下;(0,-1)向左;(-1,0)向上;
通过调整次序可实现顺时针和逆时针的遍历。
调为逆时针如下:
*/
//vector<vector<int>> dirs{ {1,0},{0,1},{-1,0},{0,-1} };//顺时针用此行
vector<int> res;
int nr = matrix.size();
if (nr == 0)
return res;
int nc = matrix[0].size();
if (nc == 0)
return res;
int nSteps[2] = { nc,nr - 1 };//逆时针用此行
//int nSteps[2] = { nr,nc-1 };//顺时针用此行
int iDir = 0;
int ir = 0, ic = -1;//逆时针用此行
//int ir = -1, ic = 0;//顺时针用此行
while (nSteps[iDir % 2])
{
for (int i = 0; i < nSteps[iDir % 2]; ++i)
{
ir += dirs[iDir][0];//行增减
ic += dirs[iDir][1];//列增减
res.push_back(matrix[ir][ic]);
}
nSteps[iDir % 2]--;//相应的行数或者列数减一
iDir = (iDir + 1) % 4;//改变方向,转为下一方向。
}
return res;
}
void main()
{
vector<vector<int>> V;
V = { {1,2,3},{4,5,6},{7,8,9}};
vector<int> R;
R= spiralOrder(V);
for (int i = 0; i < R.size(); i++)
cout << R[i]<<',';
}