c++程序设计基础: 数组ii

1 .矩阵交换行
给定一个5*5的矩阵,将第n行和第m行交换然后输出交换后的结果
输入:
共六行,前五行为矩阵的每一行元素,元素与元素之间以一个空格分开。
第六行包含两个整数m,n (1 <= m,n <= 5),以一个空格隔开
输出:
交换后的矩阵,矩阵的每一行元素占一行,元素之间以一个空格分开

样例输入
12212
56783
93053
72146
30824
1 5

样例输出:
30824
56783
93053
72146
12212

代码实现:

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int data[5][5] = {0},i,j,r1,r2;
    for(i = 0;i < 5;i++)
        for(j = 0;j < 5;j++)
            cin >> data[i][j];
    cin >> r1 >> r2;
    for(i = 0;i < 5;i++)
        swap(data[r1-1][i],data[r2-1][i]);
    for(i = 0;i < 5;i++){
        for(j = 0;j < 5;j++)
            cout << data[i][j] << " ";
        cout << endl;
    }
    return 0;
}

swap包含在头文件iostream中,交换函数参数a,b的值,学到了新的用法

3 计算矩阵的边缘之和
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素
输入:
第一行分别为矩阵行数m和列数n(m < 100,n < 100),两者之间用逗号隔开
接下来输入的m行数据中,每行包含n个正整数,整数之间以一个空格隔开
输出:
对应矩阵的边缘之和
样例输入:
3 3
3 4 1
3 7 1
2 0 1
样例输出:
15

代码实现:

#include <iostream>
using namespace std;

int main(){
    int a[100][100] = {0},m,n,i,j,s = 0;
    cin >> m >> n;
    for(i = 0;i < m;i++)
        for(j = 0;j < n;j++){
            cin >> a[i][j];
            if(i == 0||j  == 0|| i == m-1 || j == n-1)
                s += a[i][j];
        }
    cout << s << endl;
    return 0;
}

2 .计算鞍点
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的额是矩阵中的一个元素,他是所在行的最大值,并且是所在列的最小值

输入:
包含一个5*5的矩阵
输出:
如果存在鞍点,输出鞍点所在行,列及其值,如果不存在,输出“not found”
样例输入:
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25
样例输出:
4 1 8

代码实现

#include <iostream>
using namespace std;
int main(){
    int matri[5][5] = {0},i,j,m,n,max;
    bool flag = true;
    for(i = 0;i < 5;i++)
        for(j = 0;j < 5;j++)
            cin >> matri[i][j];
    for(i = 0;i < 5;i++){
        flag = true;
        max = 0;
        for(j = 0;j < 5;j++){
            if(matri[i][j] > max){
                max = matri[i][j];
                m = i;n = j;
            } 
        }
        for(j = 0;j < 5;j++){
            if(matri[j][n] < max) flag = false;
        }
        if(flag){
            cout << m+1 << " " << n+1 << " " << max << endl;
            return 0; 
        }
    }         
    cout << "not found" << endl;
    return 0;
}

4 图像相似度

输入:
第一行包括两个整数m和n(1 <= m <= 100, 1 <= n <= 100),表示图像的行数和列数,中间用单个空格隔开。
之后m行,每行n个0或1,表示第一幅黑白图像上的各像素点位置
之后m行,每行n个0或1,表示第二幅黑白图像上的各像素点位置

输出:
一个实数,表示相似度

代码实现:

#include <iostream>
using namespace std;
int main(){
    int a[100][100] = {0},b[100][100] = {0};
    int m,n,i,j,sum = 0;
    cin >> m >> n;
    for(i = 0;i < m;i++)
        for(j = 0;j < n;j++)
            cin >> a[i][j];
    for(i = 0;i < m;i++)
        for(j = 0;j < n;j++)
            cin >> b[i][j];
    for(i = 0;i < m;i++)
        for(j = 0;j < n;j++)
            if(a[i][j] == b[i][j]) 
                sum++;
    cout << sum * 1.0 / (m * n) << endl;
    return 0;
}

6 .矩阵乘法

计算两个矩阵的乘法,nm阶的矩阵A乘以mk阶的矩阵B得到的矩阵C

输入:
第一行为n,k,m 表示矩阵A的n行m列,矩阵B是m行k列
然后输入A和B两个矩阵,矩阵中每个元素绝对值都不大于1000

输出
输出矩阵C

代码实现:

#include <iostream>
using namespace std;
int main(){
    int a[100][100] = {0},b[100][100] = {0},c[100][100] = {0};
    int i,j,m,n,k;
    cin >> n >> m >> k;
    for(i = 0;i < n;i++)
        for(j = 0;j < m;j++)
            cin >> a[i][j];
    for(i = 0;i < m;i++)
        for(j = 0;j < k;j++)
            cin >> b[i][j];
    for(i = 0;i < n;i++)
        for(j = 0;j < k;j++)
            for(int t = 0;t < m;t++)
                c[i][j] += a[i][t] * b[t][j];
    for(i = 0;i < n;i++)
    {
        for(j = 0;j < k;j++)
            cout << c[i][j] << " ";
        cout << endl;
    }
    return 0;
}

矩阵的乘法只有计算最终矩阵的时候需要注意(3层循环)

7 矩阵转置

输入一个n行m列的矩阵A,输出它的转置AT

输入:
第一行包含两个整数n和m(1 <= n <= 100,1 <= m <= 100)表示矩阵A的行数和列数.接下来n行,每行m个整数,表示矩阵A的元素.相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间
输出:
m行,每行n个整数,为矩阵A的转置,相邻两个整数之间用单个空格隔开

样例输入:
3 3
1 2 3
4 5 6
7 8 9

样例输出:
1 4 7
2 5 8
3 6 8

代码实现:

#include <iostream>
using namespace std;
int main(){
    int n,m,i,j;
    int data[100][100] = {0};
    cin >> n >> m;
    for(i = 0;i < n;i++)
        for(j = 0;j < m;j++)
            cin >> data[i][j];
    for(i = 0;i < m;i++){
        for(j = 0;j < n;j++)
            cout << data[j][i] << " ";
        cout << endl;
    }
    return 0;
}

8 图像旋转

输入一个n行m列的黑白图像,将它顺时针旋转90o后输出

输入:
第一行包含两个整数n和m(1 <= n <= 100,1 <= m <= 100),表示图像包含像素点的行数和列数
接下来n行,每行m个整数,表示图像的每个像素点灰度,相邻两个整数之间用单个空格隔开,每个元素均在0~255之间

输出:
m行,每行n个整数,为顺时针旋转90o后的图像,相邻两个整数之间用单个空格隔开

样例输入:
3 3
1 2 3
4 5 6
7 8 9
样例输出:
7 4 1
8 5 2
9 6 3

代码实现:

#include <iostream>
using namespace std;
int main(){
    int data[100][100] = {0};
    int m,n,i,j;
    cin >> n >> m;
    for(i = 0;i < n;i++)
        for(j = 0;j < m;j++)
            cin >> data[i][j];
    cout << "--------" << endl;
    for(i = 0;i < m;i++){
        for(j = n-1;j >= 0 ;j--)
            cout << data[j][i] << " ";
        cout << endl;
    }
    return 0;
}

和上一题类似,只不过输出时有一点微小区别

9 .图像模糊处理
给定m行n列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理
1)四周最外层的像素点灰度值不变
2)中间各个像素点的新灰度值为该像素点及其上下左右相邻的四个像素点原灰度值的平均值(舍入到最近的整数)

输入
第一行包含两个整数n和m(1 <= n <= 100,1 <= m <= 100)表示图像包含像素点的行数和列数.
接下来输入图像像素值

输出
m行n列 模糊化后的图像矩阵

代码实现:

#include <iostream>
#include <cmath>
using namespace std;
int main(){
    int image[100][100] = {0},data[100][100] = {0};
    int i,j,m,n;
    cin >> m >> n;
    for(i = 0;i < m;i++)
        for(j = 0;j < n;j++){
            cin >> image[i][j];
            data[i][j] = image[i][j];
        }
    for(i = 1;i < m-1;i++)
        for(j = 1;j < n-1;j++){
            data[i][j] = round((image[i][j]+image[i][j-1]+image[i-1][j]+image[i+1][j]+image[i][j+1])/5.0);
        }
    for(i = 0;i < m;i++){
        for(j = 0;j < n;j++)
            cout << data[i][j] << " ";
        cout << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值