ZigZag矩阵如下图:
找出一个能满足该规律的公式即可. 源代码如下:
#include <iostream>
using namespace std;
int** alloc_mat(int mat_size); //动态二维数组的分配
void del_mat(int **mat, int mat_size); //删除动态分配的二维数组
void print_mat(int **mat, int mat_size); //打印二维数组
void fill_mat(int **mat, int mat_size); //填充数组为螺旋数组
int main()
{
int **zigzag_mat;
int mat_size;
do{
cout << "请输入ZigZag数组的阶数:" << endl;
cin >> mat_size;
//system("cls");
}while (mat_size <= 0);
zigzag_mat = alloc_mat(mat_size);
fill_mat(zigzag_mat,mat_size);
print_mat(zigzag_mat, mat_size);
del_mat(zigzag_mat, mat_size);
system("pause");
return 0;
}
int** alloc_mat(int mat_size)
{
int **mat;
int i, j;
mat = new int*[mat_size];
for (i = 0; i < mat_size; i++)
{
*(mat+i) = new int[mat_size];
}
for (i = 0; i < mat_size; i++)
for (j = 0; j < mat_size; j++)
mat[i][j] = 0;
return mat;
}
void del_mat(int **mat, int mat_size)
{
int i;
for(i = 0; i < mat_size; i++)
delete[] mat[i];
delete[] mat;
}
void print_mat(int **mat, int mat_size)
{
int i, j;
cout << "你输入的" << mat_size << "阶ZigZag数组为:" << endl << endl;
for(i = 0; i < mat_size; i++)
{
for (j = 0; j < mat_size; j++)
printf("%5d", mat[i][j]);
cout << endl;
}
cout << endl;
}
void fill_mat(int **mat, int mat_size)
{
int squa = mat_size * mat_size;
int i, j, s;
for (i = 0; i < mat_size; i++)
for (j = 0; j < mat_size; j++)
{
s = i + j;
if (s < mat_size)
mat[i][j] = s * (s + 1) / 2 + (((i + j) % 2) ? i : j);
else
{
s = (mat_size - 1 - i) + (mat_size - 1 - j);
mat[i][j] = squa - s * (s + 1) / 2 - (mat_size - ((( i + j) % 2) ? i : j));
}
}
}