CCF CSP第34次认证 矩阵重塑(其二)

题目
思路:
1.一维数组存储数据
2.重塑操作(1 p q) 只修改行数 row 和列数 col
3.转置操作(2 0 0) 遍历当前数组,交换 row 和 col
4.查询操作(3 i j) 直接按计算索引访问

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n, m, t;
    cin >> n >> m >> t;

    vector<int> matrix(n * m);  
    for (int i = 0; i < n * m; i++) {
        cin >> matrix[i];
    }

    int row = n, col = m;  //当前矩阵的行列数

    for (int i = 0; i < t; i++) {
        int op, x, y;
        cin >> op >> x >> y;

        if (op == 1) { 
            //重塑操作:仅修改行列数,不改动数据
            row = x;
            col = y;
        } 
        else if (op == 2) {  
            vector<int> temp(matrix.size()); // 临时存储转置后的数据
            for (int r = 0; r < row; r++) {
                for (int c = 0; c < col; c++) {
                    temp[c * row + r] = matrix[r * col + c]; // 交换行列位置
                }
            }
            matrix.swap(temp); // 交换矩阵数据
            swap(row, col); // 行列互换
        } 
        else if (op == 3) {
            cout << matrix[x * col + y] << endl;
        }
    }

    return 0;
}

### CCF CSP 矩阵重塑 题解与实现方法 #### 问题背景 矩阵重塑问题是CSP认证中的常见考点之一,主要考察考生对二维数组的操作能力以及逻辑思维水平。该类问题通常要求将给定的矩阵转换为目标形状的新矩阵,在此过程中需注意保持原始数据排列顺序。 #### 解决思路 为了完成矩阵重塑的任务,可以采用如下策略: 1. **验证可行性**:首先判断输入矩阵是否能够被重塑为目标尺寸。这可以通过检查原矩阵元素总数 `n * m` 是否等于目标矩阵的元素总数来决定[^1]。 2. **行主序展开**:将原矩阵按照行优先的方式展平成一维数组。这样做的好处是可以方便地重新分配这些元素到新矩阵中[^2]。 3. **构建新矩阵**:依据目标维度创建一个新的空矩阵,并依填充之前的一维数组中的值。 #### 示例代码 以下是基于Python语言的一个具体实现方案: ```python def matrixReshape(mat, r, c): # 获取原矩阵大小 rows = len(mat) cols = len(mat[0]) if mat else 0 # 判断能否重塑 if rows * cols != r * c: return mat # 如果无法满足条件,则返回原矩阵 # 将原矩阵转化为一维列表 flat_list = [mat[i][j] for i in range(rows) for j in range(cols)] # 构建新的矩阵 reshaped_matrix = [] for i in range(r): reshaped_matrix.append(flat_list[i*c:(i+1)*c]) return reshaped_matrix ``` 上述函数实现了基本的功能需求,其中特别强调了当输入参数不符合重塑规则时应直接返回初始状态下的矩阵这一细节处理。 #### 注意事项 - 数据范围可能很大,因此建议使用更高效的数据类型如`long long`代替普通的整型变量以防数值越界情况发生[^3]。 - 对于大规模数据运算时要考虑时间效率问题,合理调整算法步骤减少不必要的重复计算从而降低整体复杂度至最优级别O(d²n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值