二维数组
定义与初始化
一、定义二维数组
使用连续的两个[ ],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勿喷。