二维数组

二维数组及结构体

二维数组

定义:
二维数组,本质上是以数组作为数组元素,即“数组的数组”

int a[3][3]={{1,2,3},{1,1,1}};
int b[3][3]{1,2,3,1,1,1};

两者效果相同,第一种叫做分段赋值,第二种叫做连续赋值。
二维数组_第1张图片
!!!注意:可以省略一维的大小,但不可省略二维的大小!!!
因为二维确定了一行有几个元素

a[][3]={1,2,3,4,5,6,7,8,9};

虽然没有定义一维的大小,但根据元素个数和列数可以确定行数
即将二维数组展开成3乘3的空间。

入门题

林大OJ951
一维矩阵最大值
二维数组_第2张图片

#include 
#include 
using namespace std;
int a[100][100];
int main()
{
    int x,y,max,m,n;
    while(scanf("%d %d",&x,&y)!=EOF)
    {
        max=-1;//记录最大的a[i][j]
        for(int i=1;i<=x;i++)
        {
            for(int j=1;j<=y;j++)
            {
                scanf("%d",&a[i][j]);
                if(a[i][j]>max)
                {
                    max=a[i][j];
                    m=i;n=j;
                }//因为i和j一直在累加,所以用m来记录i;n记录j
            }
        }
        printf("%d %d %d\n",m,n,max);
    }
    return 0;
}

林大OJ953
矩阵相加
二维数组_第3张图片
对应位置的元素相加即可,不过要注意输出格式

#include 
#include 
using namespace std;
int a[100][100],b[100][100];
int main()
{
    int x,y;
    while(scanf("%d %d",&x,&y)!=EOF)
    {
        for(int i=1;i<=x;i++)//将第一个矩阵存入数组a
        {
            for(int j=1;j<=y;j++)
            scanf("%d",&a[i][j]);
        }
        for(int i=1;i<=x;i++)//第二个矩阵存入数组b
        {
            for(int j=1;j<=y;j++)
            scanf("%d",&b[i][j]);
        }
        for(int i=1;i<=x;i++)//将两个矩阵对应位置相加
        {
            for(int j=1;j<=y;j++)
           {
              a[i][j]+=b[i][j];
              if(j==y)  printf("%d",a[i][j]);//目的是让每行最后一个元素没有空格,否则输出格式不正确
              else printf("%d ",a[i][j]);
           }
            printf("\n");
        }
    }
    return 0;
}

有点难度

林大OJ952
二维矩阵对角线之和
二维数组_第4张图片
思路:
step1:求右对角线,右对角线上的元素都为a[3][3]这样的即i=j;
step2:求左对角线,左对角线上需要第一行的最后一列,第二行的倒数第二列,以此类推将i从0循环到n-1,j从n-1循环到0
step3:将左右对角线之和相加即为结果

#include 
#include 
using namespace std;
int a[100][100];
int main()
{
    int n,left,right;//left是左对角线之和,right是右对角线之和
    while(scanf("%d",&n)!=EOF)
    {
        left=right=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                scanf("%d",&a[i][j]);
                if(i==j)
                right+=a[i][j];
            }//右对角线上i=j;
        }
        int j=n-1;
        for(int i=0;i<n;i++)//控制每行都进行一次
        {
            //每行只加一列,列数从最后到第一列
            left+=a[i][j];
            j--;
        }
        printf("%d\n",right+left);
    }
    return 0;
}

林大OJ1064
矩阵的外围
即求矩阵外层的元素加和
思路:
step1:求第一行,最后一行加和
step1:求第一列,最后一列的元素加和
step3:减去矩阵位于四个角的元素,即为矩阵外围元素之和。

#include 
#include 
using namespace std;
int a[100][100];
int main()
{
    int sum1,sum2,x,y;
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        sum1=0;
        sum2=0;
        for(int i=0;i<x;i++)
        {
            for(int j=0;j<y;j++)
            {
                scanf("%d",&a[i][j]);
                if(i==0||i==x-1)//求第一行和最后一行的元素和
                sum1+=a[i][j];
            }
        }
        int j=0,n=2;
        while(n--)//控制其执行两次即只加第一列和最后一列
        {//由于本人设置第一行为i=0;所以第二行是i=1哦!
            for(int i=1;i<x-1;i++)//行数从第二行到倒数第二行
            sum2+=a[i][j];
            j=y-1;//第一列算完,再算一次第二列就好啦
        }
        printf("%d\n",sum1+sum2);
    }
    return 0;
}

林大OJ955
五人帮
二维数组_第5张图片
思路:
由于a[1][1]的周围位置只有2,3,不存在的位置补0,所以该处五人帮和为6。此题关键在于如何将不存在的位置补0;
我们可以在定义数组时将外围都处理为0

#include 
#include 
using namespace std;
int a[100][100];//定义在主函数外的数组会自动初始化为0
int main()
{
    int x,y,max,sum;
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        max=0;
        for(int i=1;i<=x;i++)//输入时从a[1][1]开始,让外围元素为0
        {
scanf("%d",&a[i][j]);
        }
         for(int i=1;i<=x;i++)
        {
            f            for(int j=1;j<=y;j++)
            or(int j=1;j<=y;j++)
            {
                 sum=a[i][j]+a[i][j-1]+a[i][j+1]+a[i-1][j]+a[i+1][j];
                 if(sum>max)
                 max=sum;
            }
        }
        printf("%d\n",max);
    }
    return 0;
}

林大OJ1031
矩阵逆时针旋转90°
二维数组_第6张图片
思路:
step1:将矩阵a行列互换即沿对角线折叠得到数组b
step2:将数组b列不变,行倒序输出即可得到所求
ps:可在纸上先进行模拟

#include 
#include 
using namespace std;
int a[105][105],b[105][105];//定义在主函数外的数组会自动初始化为0
int main()
{
    int x,y,max,sum;
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        for(int i=1; i<=x; i++)
        {
            for(int j=1; j<=y; j++)
            scanf("%d",&a[i][j]);
        }
        
        
        for(int i=1; i<=y; i++)//将行转化成列存入数组b
        {
            for(int j=1; j<=x; j++)
            b[i][j]=a[j][i];
        }
        
        
        for(int i=y; i>=1; i--)//将b按列不变,行倒序输出
        {
            for(int j=1; j<=x; j++)
            {
                if(j==x) printf("%d",b[i][j]);//注意每行的最后不加空格
                else printf("%d ",b[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

林大OJ1031
方阵相乘
二维数组_第7张图片
二维数组_第8张图片

#include 
#include 
using namespace std;
int a[10][10],b[10][10],c[10][10];
int main()
{
    int n,row,column;
    while(scanf("%d",&n)!=EOF)
    {
        memset(c,0,sizeof(c));//每次都要初始化
        for(int i=1; i<=n; i++) //输入矩阵a
            for(int j=1; j<=n; j++)
                scanf("%d",&a[i][j]);

        for(int i=1; i<=n; i++) //输入矩阵b
            for(int j=1; j<=n; j++)
                scanf("%d",&b[i][j]);

        row=1;//row储存行数
        column=1;
        for(int i=1; i<=n; i++)//计算每一行
        {
            column=1;//column储存列数
            for(int j=1; j<=n; j++)//计算每行的所有列
            {
                for(int k=1; k<=n; k++)//计算c的每一个位置
                {
                    c[row][column]+=a[row][k]*b[k][column];
                }
                column++;
            }
            row++;
        }          


        for(int i=1; i<=n; i++) //输出矩阵c
        {
            for(int j=1; j<=n; j++)
            {
                if(j==n)
                    printf("%d\n",c[i][j]);
                else
                    printf("%d ",c[i][j]);
            }
        }
    }
    return 0;
}

你可能感兴趣的:(C语言)