CCF-CSP 34-2 矩阵重塑(其二)(reshape2)【C++】考点:矩阵转置模拟

题目

TUOJhttps://sim.csp.thusaac.com/contest/34/problem/1

思路

如果会写矩阵转置,这题很容易拿满

代码

可以让AI总结一下代码逻辑

1. 核心数据结构

  • A[N][N]:存储矩阵数据(最大 10000×10000)

  • p, q:实时记录矩阵的当前行数列数

  • n, m:初始行数、列数

  • t:操作次数

2. 三种操作类型

操作1:矩阵重塑(reshape)
  • 将当前 p×q 的矩阵按行优先展开成一维数组

  • 再按行优先填充到新的 a×b 矩阵中

  • 更新 p = a, q = b

操作2:矩阵转置
  • 将当前矩阵转置(行列互换)

  • 使用辅助矩阵 temp 完成转置

  • 更新 p, q(交换行列数)

操作3:矩阵查询
  • 直接输出 A[a][b] 位置的元素(下标从0开始)

3. 执行流程

  1. 读入初始矩阵大小 n, m 和操作次数 t

  2. 读入初始矩阵到 A

  3. 循环执行 t 次操作:

    • 根据 op 值执行对应操作

    • 操作1和2会改变矩阵形状和 p, q 的值

    • 操作3直接输出查询结果

4. 关键特点

  • 动态形状:矩阵的行列数会随操作变化

  • 原地修改 :操作1和2都直接修改 A 矩阵

  • 实时记录p, q 始终记录当前矩阵的实际大小

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
int n,m,t, p, q; //p,q是真实的行/列 
const int N=1e4+5; //warn : 必须const 
int A[N][N];

void print()
{
    for(int i=0;i<p;i++)
    {
        for(int j=0;j<q;j++)
            cout<<A[i][j]<<" ";
        cout<<endl;
    }
}

void solve()
{
    cin>>n>>m>>t;
    p=n, q=m;
    for(int i=0;i<p;i++)
        for(int j=0;j<q;j++)
            cin>>A[i][j];
    while(t--)
    {
        int op,a,b; cin>>op>>a>>b;
        if(op==1) //如果op==3时直接通过一维数组查询,这里改下p和q即可
        {
            int temp[p*q+5]={};
            int cnt=0;
            for(int i=0;i<p;i++)
                for(int j=0;j<q;j++)
                    temp[cnt++]=A[i][j];
            cnt=0;
            for(int i=0;i<a;i++)
                for(int j=0;j<b;j++)
                    A[i][j]=temp[cnt++];
            p=a, q=b;
//			print();
        }
        if(op==2)
        {
            
			//int temp[N][N]={}; //warn: N*N 太大了,本地跑不起来,oj上TLE只能80分,但是去掉"={}"是100 
			int temp[p][q]={};
			for(int i=0;i<p;i++)
				for(int j=0;j<q;j++)
					temp[i][j]=A[i][j];
			for(int i=0;i<q;i++)
				for(int j=0;j<p;j++)
					A[i][j]=temp[j][i];
			swap(p,q);
//			print();
        }
        if(op==3)
        {
            cout<<A[a][b]<<endl;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0);
    solve();
    return 0; 
}
相关推荐
Halo_tjn17 分钟前
Java 基于字符串相关知识点
java·开发语言·算法
梦想的颜色22 分钟前
java 利用redis来限制用户频繁点击
java·开发语言
报错小能手24 分钟前
Swift 并发 Combine响应式框架
开发语言·ios·swift
念越34 分钟前
算法每日一题 Day08|双指针法解决三数之和
算法·力扣
万法若空1 小时前
C++ <memory> 库全方位详解
开发语言·c++
黎阳之光1 小时前
黎阳之光透明管理:视频孪生重构智慧仓储新范式
人工智能·算法·安全·重构·数字孪生
代码中介商1 小时前
C++ 类型转换深度解析:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
青小莫1 小时前
C++之string(OJ练习)
开发语言·c++·stl
freshman_y1 小时前
一篇介绍C语言中二级指针和二维数组的文章
c语言·开发语言
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先