二维数组基础
一、班级成绩输入输出
题目描述
输入一个班级5个学生各5科成绩,输出5个学生各5科成绩及总分。
输入描述:
五行,每行输入一个学生各5科成绩(浮点数表示,范围0.0~100.0),用空格分隔。
输出描述:
五行,按照输入顺序每行输出一个学生的5科成绩及总分(小数点保留1位),用空格分隔。
#include<stdio.h>
int main()
{
double arr[5][5];
for(int i=0;i<5;++i)
{
scanf("%lf %lf %lf %lf %lf",&arr[i][0],&arr[i][1],&arr[i][2],&arr[i][3],&arr[i][4]);
}//当然,我们也可以用双层循环输入
for(int i=0;i<5;++i)
{
double sum=0;//记得每次都要归零
for(int j=0;j<5;++j)
{
printf("%.1f ",arr[i][j]);
sum+=arr[i][j];
}
printf("%.1f\n",sum);//在循环外输出一次总的
}
return 0;
}
二、矩阵求最大值
题目描述
给出一个矩阵,求出其中的最大值及所在的行号和列号。
输入描述:
共n+1行
第一行输入一个整数n,
接下来的n行输入一个n行n列的矩阵(1≤n≤20),每行输入n个整数,用空格隔开。
输出描述:
一个行,3个整数,分别为最大值,其所在的行,其所在的列,用空格隔开。保证最大值唯一。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a=0,b,c,n;
int arr[21][21];
cin >>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin >>arr[i][j];
if(arr[i][j]>a)
{
a=arr[i][j];
b=i;
c=j;
}
}
}
cout <<a<<" "<<b<<" "<<c;
return 0;
}
三、矩阵统计
题目描述
KiKi想知道一个n阶矩阵中0的个数,请编程帮他实现。
输入描述:
第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (2≤n≤10)
从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。
输出描述:
一行,一个整数,表示统计n阶矩阵中0的个数。
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,cnt=0;
cin>>n;
int a[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
if(a[i][j]==0)
cnt++;
}
}
cout<<cnt;
}
四、稀疏矩阵
题目描述
给你一个n行m列的矩阵,判断他是不是稀疏矩阵,稀疏矩阵中零的个数超过矩阵中总元素个数的一半。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数
输出描述:
一行,如果该矩阵是稀疏矩阵输出"YES",否则输出"NO"。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a=0,n,m;
int arr[21][21];
cin >>n>>m;
int k=m*n/2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >>arr[i][j];
if(arr[i][j]==0)
{
a++;
}
}
}
if(a>k)
printf("YES");
else
printf("NO");
return 0;
}
五、矩阵相等判定
题目描述
KiKi得到了两个n行m列的矩阵,他想知道两个矩阵是否相等,请你回答他。(当两个矩阵对应数组元素都相等时两个矩阵相等)。
输入描述:
第一行包含两个整数n和m,表示两个矩阵包含n行m列,用空格分隔。
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入nm个数,表示第一个矩阵中的元素。
从n+2行到2n+1,每行输入m个整数(范围-231~231-1),用空格分隔,共输入nm个数,表示第二个矩阵中的元素。
1 < n,m < 10
输出描述:
一行,如果两个矩阵相等输出"Yes"并换行,否则输出"No"并换行。
第一种写法,遍历数组,判断相等的元素个数是否等于数组总元素个数
#include <iostream>
using namespace std;
int main()
{
int n, m, cnt = 0;
cin >> n >> m ;
int a[n][m], b[n][m];
for(int i = 0 ; i < n ; i ++)
{
for(int j = 0 ; j < m ; j ++)
{
cin >> a[i][j];
}
}
for(int i = 0 ; i < n ; i ++)
{
for(int j = 0 ; j < m ; j ++)
{
cin >> b[i][j];
if(a[i][j] == b[i][j]) cnt ++;
}
}
if(cnt == n * m)
{
cout << "Yes";
}
else
{
cout << "No";
}
return 0;
}
第二种判断方法,只要有元素不同就跳出
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a=0,n,m;
cin >>n>>m;
int arr1[n][m];
int arr2[n][m];
bool flag=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >>arr1[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >>arr2[i][j];
if(arr2[i][j]!=arr1[i][j])
{
flag=0;
break;
}
}
}
if(flag)//1真0假
printf("Yes");
else
printf("No");
return 0;
}
六、KiKi判断上三角矩阵
题目描述
KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。
输入描述:
第一行包含一个整数n,表示一个方阵包含n行n列,用空格分隔。 (2≤n≤10)
从2到n+1行,每行输入n个整数(范围-231~231-1),用空格分隔,共输入n*n个数。
输出描述:
一行,如果输入方阵是上三角矩阵输出"YES"并换行,否则输出"NO"并换行。
#include<bits/stdc++.h>
int main()
{
int n;
scanf("%d", &n);
int a[10][10];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &a[i][j]);
int sum = 0;
for (int i = 1; i < n; i++)
for (int j = 0; j < i; j++)
sum += a[i][j]; //或者一个一个判断是否为0
if (sum == 0)
printf("YES\n");
else
printf("NO\n");
return 0;
}
七、求矩阵各列元素最大值
题目描述
求一个给定的m行n列矩阵各列元素的最大值。
输入描述:
输入第一行给出两个正整数m和n(1≤m,n≤10)。随后m行,每行给出n个整数,其间以空格分隔。
输出描述:
一行,共n个整数,分别为n列的最大值,用空格分隔。
法一,设新数组
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[100][100],b[100];
cin >>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin >>a[i][j];
}
}
for(int i=1;i<=m;i++)
{
b[100]={0};
int p=1;
for(int j=1;j<=n;j++)
{
b[p]=a[j][i];
p++;
}
sort(b+1,b+1+n);
cout <<b[n]<<" ";
}
return 0;
}
法二,颠倒行列
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m ;
int a[n][m];
for(int i = 0 ; i < n ; i ++) //i:行
{
for(int j = 0 ; j < m ; j ++) //j:列
{
cin >> a[i][j];
}
}
for(int i = 0 ; i < m ; i ++) // i:列
{
int maxJ = 0; //假设a[maxJ][i]最大值
for(int j = 0 ; j < n ; j ++) //j:行,在循环内调整行列顺序即可
{
if(a[j][i] > a[maxJ][i] )
{
maxJ = j;
}
}
cout << a[maxJ][i] << " ";
}
return 0;
}
八、矩阵转置
题目描述
KiKi有一个矩阵,他想知道转置后的矩阵(将矩阵的行列互换得到的新矩阵称为转置矩阵),请编程帮他解答。
输入描述:
第一行包含两个整数n和m,表示一个矩阵包含n行m列,用空格分隔。 (1≤n≤10,1≤m≤10)
从2到n+1行,每行输入m个整数(范围-231~231-1),用空格分隔,共输入n*m个数,表示第一个矩阵中的元素。
输出描述:
输出m行n列,为矩阵转置后的结果。每个数后面有一个空格。
示例1
输入
2 3
1 2 3
4 5 6
输出
1 4
2 5
3 6
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m, a[11][11];
scanf("%d %d", &n, &m);
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%d", &a[i][j]);
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++)
printf("%d ", a[j][i]);
printf("\n"); //换行,换行!
}
return 0;
}
总结
二维数组基础题目大同小异,无非就是查找特定行列或者更改行列罢了。
点个关注,球球了。