给出策略打印符合以上要求的m*n螺旋矩阵。
可以将该矩阵看做一圈一圈按逆时针变化的序列,因此只需要标记每一圈的范围,再按序构造出矩阵即可。
#include<iostream>
using namespace std;
#include<vector>
//坐标按逆时针变化
int dx[] = { 0,-1,0,1 };//行变换
int dy[] = { 1,0,-1,0 };//列变换
int main() {
int m, n;
cout << "请输入矩阵的行数和列数:" << endl;
cin >> m >> n;
vector<vector<int>> v(m, vector<int>(n));
v[m - 1][0] = 1;
int x = m - 1, y = 0, edge = 0;
int up = 0, down = m - 1, left = 0, right = n - 1;//每一圈的范围
int count = 2;//计数,存储下一元素的值
int p, q;
while (count <= m * n) {
p = x + dx[edge];
q = y + dy[edge];
if (p >= up && p <= down && q >= left && q <= right) {
v[p][q] = count++;
x = p;
y = q;
}
//第一个转角
if (x == down && y == right) {
edge = 1;
continue;
}
//第二个转角
else if (x == up && y == right) {
edge = 2;
continue;
}
//第三个转角
else if (x == up && y == left) {
edge = 3;
continue;
}
//第四个转角,进入下一圈
else if (x == down - 1 && y == left) {
if (left == right) {
if (x - 1 >= up) {
x--;
v[x][y] = count++;
}
}
else {
edge = 0;
down--;
right--;
up++;
left++;
if (y + 1 <= right) {
y++;
v[x][y] = count++;
}
}
}
}
for (int i = 0; i < v.size(); i++) {
for (int j = 0; j < v[0].size(); j++) {
cout << v[i][j] << "\t";
}
cout << endl << endl << endl;
}
return 0;
}