题目描述
蛇形矩阵,是由1开始的自然数一次排列成的N*N的正方形矩阵,数字依次由外而内的递增。如 N=3时蛇形矩阵为:
1 2 3
8 9 4
7 6 5
N=6时蛇形矩阵为:
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
输入蛇形矩阵宽度,动态分配二维数组,设置蛇形矩阵并输出结果。
输入
测试次数t
每组测试数据一行:数组大小N(>0)
输出
对每组测试数据,输出计算得到的蛇形矩阵。每行元素间以空格分隔,最后一个元素后无空格。
每组测试数据之间以空行分隔。
输入样例1
3\n
3\n
6\n
2\n
输出样例1
1 2 3\n
8 9 4\n
7 6 5\n
\n
1 2 3 4 5 6\n
20 21 22 23 24 7\n
19 32 33 34 25 8\n
18 31 36 35 26 9\n
17 30 29 28 27 10\n
16 15 14 13 12 11\n
\n
1 2\n
4 3\n
\n
- 一开始总是输出错误,不是数组越界就是数据被覆盖,还是要多观察题目的两个例子才得出边界条件
#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int N;
cin >> N;
int** p = new int* [N];
for (int i = 0; i < N; i++)
p[i] = new int[N];
int num = 1;
int left = 0, right = N, up = 0, down = N;//设边界
while (left < right && up < down)//每走一圈边界判断
{
for (int i = left; i < right; i++)
p[up][i] = num++;
if (left == right - 1)//N为奇数的边界条件
break;
for (int i = up + 1; i < down; i++)
p[i][right - 1] = num++;
for (int i = right - 2; i >= left; i--)
p[down - 1][i] = num++;
if (up == down - 2)//N为偶数的边界条件
break;
for (int i = down - 2; i > up; i--)
p[i][left] = num++;
up++;
down--;
left++;
right--;
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
if (j < N - 1)
cout << p[i][j] << " ";
else
cout << p[i][j] << endl;
}
cout << endl;
delete[]p;
}
}