南京理工大学MOOC程序设计基础(Ⅰ) SPOC | 第6章作业3答案详细解析

第一题:副对角线交换(100分)

问题描述
将一个n*n矩阵元素根据副对角线交换。

输入描述
第一行输入一个整数n表示矩阵的大小,接下来输入n行,每行有n个整数(1 <= n <= 100)。

输出描述
输出根据副对角线交换后的n*n矩阵,输出格式如下:
输出n行,每行输出n个整数。每两个整数之间都有一个空格,记住,每行最后一个整数后面没有空格。

输入样例

4

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

输出样例

16 12 8 4

15 11 7 3

14 10 6 2

13 9 5 1

using namespace std;     // 使用标准命名空间,方便直接使用标准库中的标识符
#include <bits/stdc++.h>  // 引入所有标准库头文件

int main() {
    int n, i, j;          // 定义整数变量 n(矩阵的大小),i 和 j(循环变量)

    cin >> n;             // 读取矩阵的大小 n

    int a[500][500], b[500][500];  // 定义两个大小为 500x500 的二维数组 a 和 b

    // 读取矩阵 a 的元素
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            cin >> a[i][j];          // 读取矩阵 a 中的元素
            b[n - 1 - j][n - 1 - i] = a[i][j];  // 将矩阵 a 的元素旋转 180 度放入矩阵 b 中
        }
    }

    // 输出旋转后的矩阵 b
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (j) cout << " ";     // 在输出的每个元素之间添加空格,但不在行首
            cout << b[i][j];        // 输出矩阵 b 中的元素
        }
        cout << endl;              // 输出每一行后换行
    }

    return 0;                    // 程序正常结束
}
  1. 读取矩阵输入

    • 从标准输入读取一个整数 n,表示矩阵的大小(n x n)。
    • 使用两个二维数组 a 和 b 来存储矩阵。数组 a 存储输入的原始矩阵,而数组 b 用于存储旋转后的矩阵。
  2. 旋转矩阵

    • 遍历矩阵 a 的每个元素,并将其旋转 180 度后放入矩阵 b 中。
    • 元素 a[i][j] 在旋转 180 度后的位置是 b[n-1-j][n-1-i]。这是因为 180 度旋转意味着每个元素的位置都被翻转到矩阵的对角线的对称位置。
  3. 输出旋转后的矩阵

    • 遍历矩阵 b 的每个元素并输出。
    • 在输出每个元素时,除了第一个元素外,在其前面添加空格以便格式对齐。
    • 每行输出完成后换行。

第二题:字符串及其逆序数按逆序数升序输出

问题描述

在一个字符串中,如果存在i<j,且a[i]>a[j],则称a[i]和a[j]构成一个逆序。例如"DAABEC"的逆序是5,其中D与A、A、B、C构成4个逆序,E与C构成1个逆序。输入若干个字符串,将按各串及其逆序数按逆序数升序输出。

编程要求:

编写函数:int getRev(char a[]),计算并返回字符串a的逆序。

编写函数:void sort(char a[][100], int b[], int
n),根据b中保存的每个字符串的逆序数,将n行的二维数组a按逆序数升序排序。

在main中先输入n(1<=n<=20),然后输入n个字符串,每个串不多于99个字符,先计算通过调用getRev将各串的逆序数依次存入一个整型数组中,再调用sort排序后,将按各串及其逆序数按逆序数升序输出。

输入描述

先输入n(1<=n<=20),然后输入n个字符串,每个串不多于99个字符

输出描述

#include <bits/stdc++.h>  // 引入所有标准库头文件
using namespace std;     // 使用标准命名空间,方便直接使用标准库中的标识符

// 函数 getRev 计算给定字符串的逆序对数量
int getRev(char a[]) {
    int x, y;            // 定义循环变量 x 和 y
    int num = strlen(a); // 获取字符串 a 的长度
    int ans = 0;         // 定义变量 ans 用于存储逆序对的数量

    // 遍历字符串中的每个字符
    for (x = 0; x < num; x++) {
        for (y = x + 1; y < num; y++) {
            // 如果字符 a[x] 大于字符 a[y],说明 (a[x], a[y]) 是一个逆序对
            if (a[x] > a[y]) {
                ans++;  // 逆序对数量增加 1
            }
        }
    }

    return ans;          // 返回逆序对的数量
}

// 函数 sort 对字符串数组和相应的逆序对数组进行排序
void sort(char a[][100], int b[], int n) {
    int i, j, t;       // 定义循环变量 i, j 和临时变量 t
    char tmp[100];     // 定义临时字符数组 tmp 用于交换字符串

    // 使用冒泡排序算法对数组进行排序
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1; j++) {
            // 如果 b[j] 大于 b[j+1],交换 b[j] 和 b[j+1] 以及相应的字符串
            if (b[j] > b[j + 1]) {
                strcpy(tmp, a[j]);        // 交换字符串
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], tmp);
                
                t = b[j];                  // 交换逆序对数量
                b[j] = b[j + 1];
                b[j + 1] = t;
            }
        }
    }

    return;  // 函数完成排序,返回
}

int main() {
    int n, i;         // 定义整数变量 n(字符串数量)和循环变量 i
    cin >> n;         // 读取字符串的数量

    int shu[n];      // 定义整数数组 shu,用于存储每个字符串的逆序对数量
    char str[n][100]; // 定义字符数组 str,用于存储字符串

    // 读取每个字符串并计算其逆序对数量
    for (i = 0; i < n; i++) {
        cin >> str[i];         // 读取第 i 个字符串
        shu[i] = getRev(str[i]);  // 计算字符串的逆序对数量,并存储到 shu 数组中
    }

    // 根据逆序对数量对字符串进行排序
    sort(str, shu, n);

    // 输出排序后的字符串及其逆序对数量
    for (i = 0; i < n; i++) {
        cout << str[i] << " " << shu[i] << endl;  // 输出字符串及其逆序对数量
    }

    return 0;  // 程序正常结束
}
  1. 计算逆序对

    • getRev 函数计算给定字符串中的逆序对数量,即对于每一对字符 (a[x], a[y]),如果 a[x] 在 a[y] 之前出现并且 a[x] > a[y],则这一对是一个逆序对。
  2. 排序

    • sort 函数对字符串数组和相应的逆序对数量数组进行排序。使用冒泡排序算法,按照逆序对的数量对字符串进行升序排序。
  3. 主函数

    • 读取输入的字符串数量 n 和 n 个字符串。
    • 计算每个字符串的逆序对数量,并存储到数组 shu 中。
    • 使用 sort 函数根据逆序对数量对字符串进行排序。
    • 输出排序后的字符串及其对应的逆序对数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值