【数组】立体感——二维数组

二维数组

定义与初始化

一、定义二维数组
使用连续的两个[ ],type name[n1][n2],其中n1,n2可以是常量也可以是变量。但如果是变量,在定义数组前一定已经赋值过。如:

int a[3][4];

相当于3行4列的二维表,共12个元素。
而如果 i , j 有被赋值过,下面的也可以:

int a[i][j];

二维数组一般与嵌套的两层循环结合使用,外层循环变化行标,内层循环变化列标。
二维数组是怎么存放的呢?盗老师课件的图

二、初始化
1.所有元素初始化:

int a[2][3]={1,2,3,4,5,6};//第0行为1,2,3;第1行为4,5,6
int a[2][3]={{1,2,3},{4,5,6}};//第0行为1,2,3;第1行为4,5,6

2.部分元素初始化
优先为行号小的元素赋值,因为二维数组是这样存放的(盗老师课件的图
在这里插入图片描述
ps:初值个数少于数组元素个数时系统将自动补0;
初值个数多于数组元素个数时则发生错误。
举个栗子:

int a[3][3]={{0,1},{2}};
/*第0行为0,1,0;第1行为2,0,0;第2行为0,0,0*/

3.全部元素赋值的省略定义法
当为所有元素赋值时,初始化时数组的行数可以省略不写,其个数由后面初始化的元素个数与数组的列数确定。

注意:只能行数省略,列数不可省略。
e.g.

int [][3]={{1,2,3},{4,5,6}};int [2][]={{1,2,3},{4,5,6}};

4.字符二维数组的初始化的特殊方式(利用字符串常量初始化

char name[3][10]={"Harry","Herminon","Ron"};
//三行存了三个名字

若要对name赋值:

 for(int i=0;i<3;i++)

        scanf("%s",name[i]);

一大波栗子

经典的五人帮→

要求:5人帮的含义就是数字和该数字所对应的上、下、左、右和自己本身的数值之和,请求出矩阵中5人帮的最大值是多少?

Sample Input
3 4
1 2 3 4
3 4 5 6
2 3 3 9
Sample Output
24

代码:

#include <iostream>
#include<bits/stdc++.h>//万能头文件
using namespace std;

int main()
{
    int m,n,a[100][100],i,j,max5,s;
    while(~scanf("%d %d",&m,&n))
    { s=0;
        for(i=0;i<=m+1;i++)
        for(j=0;j<=n+1;j++)
         {
             if(i>=1&&j>=1&&i<=m&&j<=n)
             //为了把可见矩阵之外的元素表示为0,需要讨论i,j的范围
             {
                 scanf("%d",&a[i][j]);

             }
             else
                a[i][j]=0;
         }
         max5=0;

         for(i=0;i<=m+1;i++)
        for(j=0;j<=n+1;j++)
        {
            if(i>=1&&j>=1&&i<=m&&j<=n)
            {
                s=a[i][j]+a[i][j+1]+a[i][j-1]+a[i+1][j]+a[i-1][j];
                if(s>=max5)
                    max5=s;//不断比较 找出最大的和
            }
        }

      printf("%d\n",max5);

    }
    return 0;
}

回转小矩阵

要求:将原矩阵逆时针旋转90°后输出

Sample Input
3 5
1 2 3 4 5
2 4 9 2 1
3 4 5 7 9
Sample Output
5 1 9
4 2 7
3 9 5
2 4 4
1 2 3

代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n,m,i,j,a[100][100],b[100][100];
    while(~scanf("%d %d",&n,&m))
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
        for(i=1;i<=m;i++)
            for(j=1;j<=n;j++)
        {
            b[i][j]=a[j][m+1-i] ;
            if(j<n)//要注意输出时的格式
                printf("%d ",b[i][j]);
            else
                printf("%d\n",b[i][j]);//每行的最后一列要换行
        }
    }
    return 0;

}

矩阵相乘

要求:计算2个方阵的乘积!

Sample Input
2
1 2
1 2
3 1
1 3
Sample Output
5 7
5 7

代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main()
{
    int m,a[100][100],b[100][100],c[100][100],i,j,k,s;
    while(~scanf("%d",&m))
    {
        for(i=1; i<=m; i++)
            for(j=1; j<=m; j++)
                scanf("%d",&a[i][j]);
        for(i=1; i<=m; i++)
            for(j=1; j<=m; j++)
                scanf("%d",&b[i][j]);
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=m; j++)
            {
                c[i][j]=0;
                for(k=1; k<=m; k++)
                {
                    c[i][j]=c[i][j]+a[i][k]*b[k][j];

                }
            }
        }
        for(i=1; i<=m; i++)
            for(j=1; j<=m; j++)
            {
                if(j==m)
                    printf("%d\n",c[i][j]);
                else
                    printf("%d ",c[i][j]);
            }

    }
    return 0;
}

结:
1)涉及到二维数组的例题有待补充,目前只粘了几道学校OJ的;锐格等我!
2)发现二维数组的题好多涉及到矩阵的知识, QAQ看来终究躲不过线代这座大山。
3)内容过于基础仅做笔记只用,各路dalao勿喷。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值