任何疑问、意见、建议请留言公众号:一航代码
题目描述:
打印出如下图所示的螺旋矩阵:当 n = 4 时:
1 | 2 | 3 | 4 |
12 | 13 | 14 | 5 |
11 | 16 | 15 | 6 |
10 | 9 | 8 | 7 |
要求:打印出螺旋矩阵,求第 i 行 j 列的数字,0<n<10000。
输入格式:
输入螺旋矩阵的阶数 n ,0<n<10000。
输出格式:
输出螺旋矩阵,矩阵中的每个数字的数据宽度为5,用空格隔开,每行数据末尾不存在空格。
输入样例:
4
输出样例:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解决方法:
+---------------->X轴
| 1 2 3 4
| 12 13 14 5
| 11 16 15 6
| 10 9 8 7
Y轴
设元素1的坐标为(0,0),元素13的坐标为(1,1),……,任一元素的坐标为(x,y),亦可以采用递归的方式,借助于一个二维数组,从外圈开始,向内圈打印输出。
(1)代码实现:
#include <bits/stdc++.h>
#define MAX_SIZE 10000
using namespace std;
int spiral[MAX_SIZE][MAX_SIZE];
void print_spiral(int x, int y, int num, int n)
{
if (n <= 0)
{
return;
}
if (n == 1)
{
spiral[x][y] = num;
return;
}
for (int i = x; i < x + n - 1; i++) //向右遍历
{
spiral[y][i] = num++;
}
for (int i = y; i < y + n - 1; i++) //向下遍历
{
spiral[i][y + n - 1] = num++;
}
for (int i = x + n - 1; i > x; i--) //向左遍历
{
spiral[y + n - 1][i] = num++;
}
for (int i = y + n - 1; i > y; i--) //向上遍历
{
spiral[i][x] = num++;
}
print_spiral(x + 1, y + 1, num, n - 2); //递归下一层
}
int main()
{
fill(spiral[0], spiral[0] + MAX_SIZE * MAX_SIZE, -1);
int n;
cin >> n;
print_spiral(0, 0, 1, n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%5d", spiral[i][j]);
}
cout << endl;
}
return 0;
}