题目描述
蛇形矩阵,是由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
3
6
2
输出样例1
1 2 3
8 9 4
7 6 5
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
1 2
4 3
该题主要考察二维动态数组的创建(注意delete)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include <iomanip>
using namespace std;
int main()
{
int t,x=0,y=0,n,total=1,sign=1;
cin >> t;
while (t--)
{
total = 1;
x = 0;
y = 0;
cin >> n;
int** ans = new int* [n];
for (int i = 0; i < n; i++)
{
ans[i] = new int[n];
for (int j = 0; j < n; j++)
{
ans[i][j] = 0;
}
}
ans[0][0] = 1;
while (total != n * n)
{
while (y + 1 < n && !ans[x][y + 1])
{
ans[x][++y] = ++total;
}
while (x + 1 < n && !ans[x + 1][y])
{
ans[++x][y] = ++total;
}
while (y - 1 >= 0 && !ans[x][y - 1])
{
ans[x][--y] = ++total;
}
while (x - 1 >= 0 && !ans[x - 1][y])
{
ans[--x][y] = ++total;
}
}
for (int i = 0; i < n; i++)
{
sign = 1;
for (int j = 0; j < n; j++)
{
if (sign)
{
sign = 0;
cout << ans[i][j] ;
}
else
cout << ' ' << ans[i][j];
}
cout << endl;
}
for (int i = 0; i < n; i++)
{
delete[]ans[i];
}
delete[]ans;
cout<<endl;
}
return 0;
}