L2-数据结构-第03课 多维数组
多维数组
数组: 是相同数据类型组成的集合。
int, double, long long, 结构体都可以作为组成元素。
当一维数组作为数组元素的时候, 就组成了多维数组。
如何理解
程序中的数据是为了描述世界的。以上课的教室为例,一般有多行和多列, 就组成了二维数组 学生[行][列]. 一个城市有多个学校, 一个学校有多个年级, 每个年级有多个班级, 每个班级又有多个行和列.
学生[学校][年级][班级][行][列]
所以求一个城市学习最努力的学生, 模拟如下:
学生[学校][年级][班级][行][列]
for(学校 = 第一个; 学校存在; 下个学校) {
for(年级=1; 年级<6; 年级++) {
for(班级=1; 班级<= 最大班级;班级++) {
for(行...) {
for(列...) {
if(学生[学校][年级][班级][行][列] 比最努力 还努力) {
最努力= 学生[学校][年级][班级][行][列]
}
}
}
}
}
}
图像保存也多用数组.
2020 年初赛真题:
现有一张分辨率为2048*1024像素的32位真彩色图像, 请问要存储这张图像, 需要多大的存储空间?()
A 16MB B 4MB c 8MB D 32MB
32位是说这个图像的一个像素点需要32bit的数来表示. 所以有 2048 * 1024 * 32 / 8 = 8MB
多维数组的定义
- 二维数组的定义
类型名 数组名 [行长度] [列长度]
二维数组的元素个数: 行长度 * 列长度
int a[3][3]; 数组名: a 数组元素类型: int 行长度 : 3 列长度 : 3 总元素个数: 9
多维数组的赋值
- 所有元素为0
int[3][7] = {0};
- 依次赋值
int[3][7] = {1,2,3,4,5, ... 21}; \\太多,容易乱, 不推荐
- 分行赋值
int[3][7] = {
{1,2,3,4,5,6,7},
{11,22,33,44,55,66,77},
{111,222,333,444,555,666,777},
};
- 部分赋值
int[3][7] = {
{1,2,3,},
{0},
{111,222,333,444},
};
多维数组的遍历
int a[N][M];
for(int i = 0; i for(int j = 0; j cout < }
}
多维数组和一维数组的关系
下面哪行语句会编译错误?
1. int a1[6][6]= {{1,}, {2,}};
2. int a2[][6] = {{1,}, {2,}};
3. int a3[6][] = {{1,}, {2,}};
例题 1
P1319 压缩技术
- 题目描述
设某汉字由 N × N 的 0 和 1 的点阵图案组成。
我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下。第一个数表示连续有几个0,第二个数表示接下来连续有几个1,第三个数再接下来连续有几个0,第四个数接着连续几个1,以此类推……
例如: 以下汉字点阵图案:
0001000
0001000
0001111
0001000
0001000
0001000
1111111
对应的压缩码是:7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是N ,其余各位表示交替表示0和1 的个数,压缩码保证 N × N=交替的各位数之和)
- 输入格式
一行,压缩码。
- 输出格式
汉字点阵图(点阵符号之间不留空格)。(3<=N<=200)
输入输出样例
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
0001000
0001000
0001111
0001000
0001000
0001000
1111111- 输出 #1复制
- 输入 #1复制
分析
可以定义一个一维数组, 然后把 1 和 0 分别填写进去, 然后按照行存储的二维数组方式进行输出.
- 参考代码
#include
#include
using namespace std;
int n, m, flag, idx;
int a[202*202];
int main(){
cin >> n;
while(cin >> m ) {
if(flag == 0) {
for(int i = 1; i <= m; i++)
a[idx++] = 0;
flag = 1;
} else {
for(int i = 1; i <= m; i++)
a[idx++] = 1;
flag = 0;
}
if(idx == n * n)
break;
}
for(int i = 0; i for(int j = 0; j cout < }
cout <endl;
}
return 0;
}
例题 2
P5731 【深基5.习6】蛇形方阵
- 题目描述
给出一个不大于 9 的正整数 n,输出 的蛇形方阵。
从左上角填上 1 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3 个字符,前面使用空格补齐。
- 输入格式
无
- 输出格式
无
输入输出样例
4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7- 输出 #1复制
- 输入 #1复制
分析
方法 1. 一直往一个方向填, 碰到了已经填过的数组就转向. 方法 2. 数填的个数, 最外圈每个方向是 n-1 个, 然后每圈的个数是外圈个数 -2
- 思考:
如果 n 很大比如 , 怎么求出第 i 行 第 J 列的数字呢?
- 参考代码
方法 1:
#include
using namespace std;
int a[15][15];
int main(){
int n,k=1,x=1,y=0;;
cin>>n;
while (k<=n*n)
{
while(y1])a[x][++y]=k++;while(x1][y])a[++x][y]=k++;while(y>1&&!a[x][y-1])a[x][--y]=k++;while(x>1&&!a[x-1][y])a[--x][y]=k++;
}for (int i=1;i<=n;i++)
{for (int j=1;j<=n;j++)printf("%3d",a[i][j]);printf("\n");
}return 0;
}
方法 2:
#include
#include
#include
using namespace std;
int n, a[12][12];
int main(){
cin >> n;
int len = n - 1;
int x = 1, y = 1;
int idx = 1;
while(len > 0) {
for(int i = 1; i <= len; i++)
a[x][y++] = idx++;
for(int i = 1; i <= len; i++)
a[x++][y] = idx++;
for(int i = 1; i <= len; i++)
a[x][y--] = idx++;
for(int i = 1; i <= len; i++)
a[x--][y] = idx++;
x++;
y++;
len -= 2;
}
if(len == 0)
a[x][y] = idx;
for(int i = 1; i <= n; i++) {
for(int j = 1; j<= n; j++) {
cout <3) < }
cout <endl;
}
return 0;
}
更难的:
P2239 螺旋矩阵
作业
- P2615 神奇的幻方
- P5731 【深基5.习6】蛇形方阵
- P5732 【深基5.习7】杨辉三角
- P1789 【Mc生存】插火把
- P1319 压缩技术
- P1320 压缩技术(续集版)
- P1205 [USACO1.2]方块转换 Transformations
云帆编程老师联系方式:
云帆老师
微信: