开发工具与关键技术: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);
}
输出图片: