问题描述
蛇形矩阵,是由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)
输出
对每组测试数据,输出计算得到的蛇形矩阵。每行元素间以空格分隔,最后一个元素后无空格。
每组测试数据之间以空行分隔。
样例
输入:
3
3
6
2
输出:1 2 3
8 9 4
7 6 51 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 111 2
4 3
#include<iostream>
using namespace std;
int main()
{
int t, n, i, j,a,b;
int tag;
cin >> t;
while (t--)
{
cin >> n;
int** p= new int*[n];
for (i = 0; i < n; i++)
{
p[i] = new int[n];
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
p[i][j] = 0;
}
}
a = 0; b = 0;
tag = 0;
i = 0;
while (i < n*n)
{
if (tag == 0) {
p[a][b] = i+1;
b++;i++;
if (b == n){
tag=1;a++;b--;
}
else if (p[a][b] != 0){
tag=1;a++;b--;
}
continue;
}
if (tag == 1) {
p[a][b] = i+1;
a++;i++;
if (a == n){
tag=2;b--;a--;
}
else if (p[a][b] != 0){
tag=2;b--;a--;
}continue;
}
if (tag == 2) {
p[a][b] = i+1;
b--;i++;
if (b == -1){
tag=3;a--;b++;
}
else if (p[a][b] != 0){
tag=3;a--;b++;
}continue;
}
if (tag == 3) {
p[a][b] =i+1;
a--;i++;
if (a == -1){
tag=0;b++;a++;
}
else if (p[a][b] != 0){
tag=0;b++;a++;
}continue;
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if(j!=n-1)cout << p[i][j]<<" ";
else cout<<p[i][j];
}
cout << endl;
}
cout << endl;
delete []p;
}
return 0;
}