C++的n*n螺旋输出数组

开发工具与关键技术:Visual Studio C++

作者:华境聪

撰写时间:2019/5/15

在这里用到的二维动态数组遍历,通俗易懂。

#include <iostream>
#include "Factorial.h"
using namespace std;
void show(int* a[], int n)
{
	for (int i = 0; i < n; i++)
	{//把数组内的数字按顺序输出
		for (int h = 0; h < n; h++) {
			cout << a[i][h] << "\t";
		}
		cout << endl;
	}
	cout << endl;
}

/*5*5顺序*/
void fact(int n)
{
	int  h, l, x = 1;
	int** a;
	a = new int* [n];
	for (int i = 0; i < n; i++) {
		a[i] = new int[n];
	}
	h = 0;//行1
	l = n - 1;//列//4
	do
	{//这边的注释就讲解第一圈(最外面一圈)的
		for (int i = (n - 1 - l); i <= l; i++)//第一行
		{
			a[h][i] = x++;//a[0][0`4]《1-5》
		}

		for (int i = h + 1; i <= (n - 1 - h); i++)//最后一列。
		{
			a[i][l] = x++;//a[1~4][4]《6-9》
		}

		for (int i = l - 1; i >= (n - 1 - l); i--)//最后一行 i=3;i>=0;
		{
			a[n - 1 - h][i] = x++;//a[4][3`0]《10-13》
		}
		h++;//下个循环h要加1,而且为下一个for循环减少一个行数
		for (int i = (n - 1 - h); i >= h; i--)//第一列
		{
			a[i][n - 1 - l] = x++;//a[3`1][0]《14-16》

		}
		l--;//下个循环列要减1
	} while (x <= (n * n));
	show(a, n);
	delete[] a;
	a = NULL;
	factf(n);//逆序
}

/*5*5逆序*/
void factf(int n)
{
	int h, l, x = 1;
	int** a;
	a = new int* [n];
	for (int i = 0; i < n; i++) {
		a[i] = new int[n];
	}
	h = 0;//行
	l = n - 1;//列
	do
	{
		for (int i = h; i <= (n - 1 - h); i++)//第一列
		{
			a[i][n - 1 - l] = x++;
		}
		for (int i = (h + 1); i <= (n - 1 - h); i++)//最后一行
		{
			a[l][i] = x++;
		}
		h++;//下个循环h要加1;
		for (int i = (n - 1 - h); i >= (n - l - 1); i--)//最后一列
		{
			a[i][l] = x++;
		}
		for (int i = (n - h - 1); i >= h; i--)//第一行
		{
			a[n - l - 1][i] = x++;
		}
		l--;//下个循环列要减1
	} while (x <= (n * n));
	show(a, n);
	delete[] a;
	a = NULL;
}
int main()
{
	/*5*5阶乘*/
	int n;
	cin >> n;
	fact(n);
}

 

输出图片:

 

猜你喜欢

转载自blog.csdn.net/qq_41979469/article/details/90270659