定义:
二维数组,本质上是以数组作为数组元素,即“数组的数组”
int a[3][3]={{1,2,3},{1,1,1}};
int b[3][3]{1,2,3,1,1,1};
两者效果相同,第一种叫做分段赋值,第二种叫做连续赋值。
!!!注意:可以省略一维的大小,但不可省略二维的大小!!!
因为二维确定了一行有几个元素
a[][3]={1,2,3,4,5,6,7,8,9};
虽然没有定义一维的大小,但根据元素个数和列数可以确定行数
即将二维数组展开成3乘3的空间。
#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
矩阵相加
对应位置的元素相加即可,不过要注意输出格式
#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
二维矩阵对角线之和
思路:
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
五人帮
思路:
由于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°
思路:
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;
}
#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;
}