PAT 乙级题解 ——1097 矩阵行平移

文章介绍了如何解决PAT乙级考试中的一道编程题,涉及一个n×n矩阵的行平移问题。给定矩阵、平移步数k和填充值x,程序需要计算平移后的每一列元素之和。代码示例中提供了一个C++解决方案,通过遍历矩阵的奇数行并进行移动操作来实现题目要求的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT 乙级题解 ——1097 矩阵行平移

基本题意:

给定一个 n×n 的整数矩阵。对任一给定的正整数 k<n,我们将矩阵的奇数行的元素整体向右依次平移 1、……、k、1、……、k、…… 个位置,平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一列元素的和。
输入格式:
输入第一行给出 3 个正整数:n(<100)、k(<n)、x(<100),分别如题面所述。

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

输出格式:
在一行中输出平移后第 1 到 n 列元素的和。数字间以 1 个空格分隔,行首尾不得有多余空格。
样例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

输出:

529 481 479 263 417 342 343

题目分析:

直接看代码注释吧

AC code

#include <iostream>
using namespace std;
const int N = 200;
int g[N][N];
int m, k, x;
//移动函数
void move(int *p, int n){
    //需要将整行向右移动n个位置
    //相当于将整行右移一个位置, 并做n 次该操作
    for(int i = 0; i < n; i++) //n 次操作
        for(int j = m; j >= 1; j--)
            p[j + 1] = p[j];
    //并将前n个位置置为 x;
    for(int i = 1; i <= n; i++)
        p[i] = x;

}
int main(){
    cin >> m >> k >> x;
 
    //读入矩阵, 下标从1开始
    for(int i = 1; i <= m; i++)
        for(int j = 1; j <= m; j++)
            cin >> g[i][j];
    
    //遍历每个奇数行
    int s = 1; //记录需要向后位移平移几个位置
    for(int i = 1; i <= m; i++){
        if(i % 2 == 0) continue;
        move(g[i], s);
        s++; //需要移动的位置 + 1
        // 当需要移动的位置大于 k 时 从一重新开始
        if(s == k + 1)
            s = 1;
    }
    

    
    //输出列和
    for(int i = 1; i <= m; i++){
        int sum = 0;
        for(int j = 1; j <= m; j++)
            sum += g[j][i];
    
        cout << sum ;
        if(i != m) cout << " ";
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值