E. 蛇形矩阵(指针与动态内存分配)

73 阅读2分钟

题目描述

蛇形矩阵,是由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;
}