8086怎么输出数组_L2数据结构第03课 多维数组

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

2211dde02b5a050cb7d0c55b9ef3558f.png

多维数组的赋值

  • 所有元素为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,}};
ae278fd40145608d4c073d24fbb0e5a4.png

例题 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

云帆编程老师联系方式:

云帆老师

微信:

e8d7ab61a1379174dd8e56e25ee953bd.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值