C语言:二维数组

    二维数组的定义与一维数组相似。

     类型名  数组名【】【】;例: 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: 地雷数量求解

题目描述

为了保证边境重要的军事基地不会被敌人入侵,我军在敌军的必经之路上埋了x颗地雷,已知这片必经之地是n * m的方阵形状,为了让我们的友军知道哪些地方是有地雷的,我军工兵绘制了一张地雷分布图。在这张分布图中,如果某个点没有地雷,那么这个点所标记数字的各个位之和会是一个偶数;反之如果该点有地雷,这个点所标记数字的各个位之和是一个奇数。
请你编程计算出,该区域总共埋了多少颗地雷。
比如:下方有一张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;
}
  

注:这都是二维数组中比较简单的几道题,主要的作用是进一步理解二维数组的应用,想刷难一点的题建议上洛谷或其他平台练习。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值