二维数组的定义与一维数组相似。
类型名 数组名【】【】;例: int a[3][3];
有时把二维数组称为矩阵,第一个方括号称为矩形的行,第二个方括号称为矩形的列。
光说理论似乎有些苍白,主要还是在做题中感悟二维数组的魅力。
例1: 郭远摘苹果
题目描述
郭远有一天走到了一片苹果林,里面每颗树上都结有不同数目的苹果,郭远身上只能拿同一棵树上的苹果,他每到一棵果树前都会把自己身上的苹果扔掉并摘下他所在树上的苹果并带走(假设郭远会走过每一棵苹果树),问在郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差是多少?
输入
m,n(即苹果林中有果树的行数和列数,0<n,m<=10) m行n列数据(即每颗树上的苹果数,不超过100)
输出
1个数字(郭远摘苹果的整个过程中,他身上携带的最多苹果数与最小苹果数的差)
样例输入
4 3 2 6 5 1 3 7 5 3 5 1 7 12
样例输出
11
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
const int MAXN=10000012;
const int N=1e6+7;
const int INF=0x3f3f3f3f;
const int P=131;
//这个题就是求二维数组中最大元素与最小元素的差,比较水。
int apple[20][20],maxn,minn,n,m;
int main(){
maxn=0,minn=999; //由于后面需要比较,所以将maxn的值设小些,将minn的值设大些
cin >> n >> m;
for(int i=0;i<n;i++){ //需要两个循环用来输入数组元素
for(int j=0;j<m;j++){
cin >> apple[i][j];
if(maxn<apple[i][j]){ //比较求数组中的最大元素
maxn=apple[i][j];
}
if(minn>apple[i][j]){ //比较求数组中的最小元素
minn=apple[i][j];
}
}
}
cout << maxn-minn << "\n";
return 0;
}
例 2: 地雷数量求解
题目描述
请你编程计算出,该区域总共埋了多少颗地雷。
比如:下方有一张5 * 6的地雷分布图,其中埋有地雷的区域用灰色背景做了标记,该区域中共有10颗地雷。
12 | 35 | 90 | 21 | 1 | 9 |
91 | 3892 | 8749 | 342 | 3421 | 89 |
1881 | 1111 | 39 | 4 | 1 | 34 |
9 | 93 | 34 | 12 | 45 | 0 |
67 | 4 | 34 | 19 | 235 | 32 |
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
const int MAXN=10000012;
const int N=1e6+7;
const int INF=0x3f3f3f3f;
const int P=131;
int n,m;
int dl[120][120];
int main(){
int cnt=0;
cin >> n >> m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> dl[i][j];
int t=0;
while(dl[i][j]>0){ //求元素位数之和
t+=dl[i][j]%10;
dl[i][j]/=10;
}
if(t%2==1){ //若是奇数,cnt加一
cnt++;
}
}
}
cout << cnt << "\n";
return 0;
}
例3: 靶心数
题目描述
James同学发现了在二维数组中有这样一类数,这个数正好比自己上下左右四个方向的数都大(由于需要比四个方向的数都大,因此这个数不可能在第一行、最后一行、第一列、最后一列),James把它们称为靶心数,请你编程求出一个二维数组的靶心数有哪些,输出他们。
输入
第一行是两个整数n和m(n和m都是4~100之间的整数),代表接下来的二维数组有n行m列。
接下来n行,每行有m个整数。
输出
请按照输入的顺序输出满足条件的靶心数,每行1个。
样例输入
4 4 1 2 3 4 5 6 5 8 9 1 11 10 13 4 5 16
样例输出
6 11
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
const int MAXN=10000012;
const int N=1e6+7;
const int INF=0x3f3f3f3f;
const int P=131;
int n,m;
int a[120][120];
int main(){
cin >> n >> m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin >> a[i][j];
}
}
for(int i=1;i<n-1;i++){
for(int j=1;j<m-1;j++){
if(a[i][j]>a[i-1][j]&&a[i][j]>a[i+1][j]&&a[i][j]>a[i][j-1]&&a[i][j]>a[i][j+1]){ //比较四周数组元素,符合条件则输出
cout << a[i][j] << "\n";
}
}
}
return 0;
}
例4: 数字走向II
题目描述
输入整数N,输出相应方阵。
输入
一个整数N。( 0 < n < 10 )
输出
一个方阵,每个数字的场宽为3。
样例输入
5
样例输出
21 22 23 24 25 16 17 18 19 20 11 12 13 14 15 6 7 8 9 10 1 2 3 4 5
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ULL;
const int MAXN=10000012;
const int N=1e6+7;
const int INF=0x3f3f3f3f;
const int P=131;
int n;
int a[12][12];
int main(){
cin >> n;
int t=1;
for(int i=n-1;i>=0;i--){
for(int j=0;j<n;j++){
a[i][j]=t++;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%3d",a[i][j]);
}
cout << "\n";
}
return 0;
}
注:这都是二维数组中比较简单的几道题,主要的作用是进一步理解二维数组的应用,想刷难一点的题建议上洛谷或其他平台练习。