L1-7 矩阵列平移

题目

给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的偶数列的元素整体向下依次平移 1、......、k、1、......、k、...... 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。

输入格式:

输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。

接下来 n 行,每行给出 n 个不超过 100 的正整数,为矩阵元素的值。数字间以空格分隔。

输出格式:

在一行中输出平移后第 1 到 n 行元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

7 2 99

11 87 23 67 20 75 89

37 94 27 91 63 50 11

44 38 50 26 40 26 24

73 85 63 28 62 18 68

15 83 27 97 88 25 43

23 78 98 20 30 81 99

77 36 48 59 25 34 22
输出样例:

440 399 369 421 302 386 428

样例解读

需要平移的是第 2、4、6 列。给定 k=2,应该将这三列顺次整体向下平移 1、2、1 位(如果有更多列,就应该按照 1、2、1、2 ...... 这个规律顺次向下平移),顶端的空位用 99 来填充。平移后的矩阵变成:

11 99 23 99 20 99 89

37 87 27 99 63 75 11

44 94 50 67 40 50 24

73 38 63 91 62 26 68

15 85 27 26 88 18 43

23 83 98 28 30 25 99

77 78 48 97 25 81 22

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int main()
{
    // 读取矩阵大小 n、平移步长 k 和填充元素 num
    int n, k, num;
    cin >> n >> k >> num;

    // 用于记录当前偶数列的平移步数,初始为 1
    int p = 1;

    // 定义两个 n+1 行 n+1 列的二维数组
    // s 数组用于存储原始矩阵元素
    // s_aim 数组用于存储平移后的矩阵元素
    int s[n + 1][n + 1];
    int s_aim[n + 1][n + 1];

    // 读取矩阵元素并初始化 s_aim 数组
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> s[i][j];
            s_aim[i][j] = s[i][j];
        }
    }

    // 遍历矩阵的每一列
    for (int i = 1; i <= n; i++) {
        // 如果平移步长为 0,无需平移,跳出循环
        if (k == 0) break;

        // 如果是偶数列,进行平移操作
        if (i % 2 == 0) {
            // 将当前偶数列元素向下平移 p 个位置
            for (int j = n; j >= 1; j--) {
                s_aim[j][i] = s[j - p][i];
            }

            // 用 num 填充平移后空出的位置
            for (int j = 1; j <= p; j++) {
                s_aim[j][i] = num;
            }

            // 更新平移步数 p,按 1 到 k 循环
            p = (p % k) + 1;
        }
    }

    // 计算并输出平移后矩阵每行元素的和
    for (int i = 1; i <= n; i++) {
        int sum = 0;
        for (int j = 1; j <= n; j++) {
            sum += s_aim[i][j];
        }
        cout << sum;
        // 每行和之间用空格分隔,但最后一行末尾无空格
        if (i != n) cout << " ";
    }

    return 0;
}
相关推荐
不知天地为何吴女士1 小时前
Day32| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
算法
小坏坏的大世界1 小时前
C++ STL常用容器总结(vector, deque, list, map, set)
c++·算法
wjs20242 小时前
状态模式(State Pattern)
开发语言
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
liulilittle2 小时前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜4 小时前
ART配对软件使用
开发语言·c++·qt·算法
qq_513970444 小时前
力扣 hot100 Day56
算法·leetcode
PAK向日葵5 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子6 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
爱喝矿泉水的猛男7 小时前
非定长滑动窗口(持续更新)
算法·leetcode·职场和发展