1 定义
在C++中,如果数组的元素又是数组,则称为二维数组,其每一维对应一个下标,第一维通常称为行(row),第二维则称为列(column)。例如
int a[2][3];
可以将二维数组a看成是一个2行3列的矩阵。
2 初始化
2.1使用花括号进行初始化
可以使用花括号括起来的初始化式列表来初始化二维数组的元素。
int a[2][3] = {
{1, 2, 3}
, {4, 5, 6}
};
2.2 不使用花括号进行初始化
也可以不使用花括号,而是将二维数组中的每个元素排列后进行初始化。
int a[2][3] = {1, 2, 3, 4, 5, 6};
2.3 置零初始化
通常情况下,如果要将二维数组中所有的元素都置零时,可以使用如下方法:
int a[2][3] = {0};
3 下标引用
可以使用下标运算符来访问二维数组的元素,此时数组的每个维度对应一个下标运算符。如
int i = a[0][1];
表示将i的值赋值成二维数组中第1行第2列的元素值。
4 通过二维数组实现蛇形填数
蛇形填数指的是从1开始,以1为步进,按照蛇形排列,将指定的位置填上指定的数。下图为5*5矩阵时的蛇形填数排列。
4.1 初始化操作
定义一个维数为20*20的二维数组,并且将该数组的第1行,第20列的元素设置为1,即蛇形排列的起始位置。
#define MAX_N 20
int a[MAX_N][MAX_N] = { 0 };
int x = 0;
int y = MAX_N -1;
int value = a[x][y] = 1;
4.2 按蛇形排列设置数组的值
如上图所示,将蛇形排列,头尾连接看成是一个循环,即从1-16是一个循环,从17-24是另一个循环,25是最后一个循环。每个循环都由4个步骤组成,即由上向下、由右向左,由下向上,由左向右,最后形成头尾相连。因此,有如下代码
while (value < n*n)
{
while (x + 1 < n && !a[x + 1][y])//由上向下
a[++x][y] = ++value;
while (y - 1 >= 0 && !a[x][y - 1])//由右向左
a[x][--y] = ++value;
while (x - 1 >= 0 && !a[x - 1][y])//由下向上
a[--x][y] = ++value;
while (y + 1 < n && !a[x][y + 1])//由左向右
a[x][++y] = ++value;
}
其中,外面的while()语句的循环条件就是判断是否将二维数组中所有的位置都设置了值,每循环一次就完成上述的四个步骤,而里面的四个while()语句就对应了一次循环的四个步骤。这四个while()语句的循环条件是一个逻辑与操作符。逻辑与操作符中第一个表达式保证了行数或者列数不超过二维数组最大的行数或者列数;第二个表达式判断了下一个要赋值的位置上的值是否是0,如果是0,则说明该位置没有被赋值,可以对其进行赋值;如果不是0,则说明该位置已经被赋过值,就不必再进行赋值了。
4.3 二维数组的打印
通过for循环语句的嵌套实现二维数组的打印。
for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%5d", a[x][y]);
printf("\n");
}
其中,第一个printf()中的参数“5”是将所有输出的数字宽度指定为5,保证了输出的矩阵行和列是对齐的;第二个printf()的作用是换行,即每输出完一行,则需要换行继续输出下一行。
5 完整代码
以下为实现蛇形输出的完整代码。
#include "stdafx.h"
#include <string.h>
#define MAX_N 20
int main()
{
int n, x, y, value = 0;
while (1)
{
printf("请输入数组的维数,最大值为%d.\n", MAX_N);
scanf_s("%d", &n);
if (n > MAX_N)
{
printf("输入的维数大于指定的维数,最大维数为%d.\n", MAX_N);
continue;
}
int a[MAX_N][MAX_N] = { 0 };
value = a[x = 0][y = n - 1] = 1;
while (value < n*n)
{
while (x + 1 < n && !a[x + 1][y])
a[++x][y] = ++value;
while (y - 1 >= 0 && !a[x][y - 1])
a[x][--y] = ++value;
while (x - 1 >= 0 && !a[x - 1][y])
a[--x][y] = ++value;
while (y + 1 < n && !a[x][y + 1])
a[x][++y] = ++value;
}
printf("维数为%d的蛇形排列数组为:\n", n);
for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%5d", a[x][y]);
printf("\n");
}
}
return 0;
}