CCF-CSP认证 2024年6月 2.矩阵重塑(其二)

原题链接TUOJ (thusaac.com)

时间限制: 1.0 秒

空间限制: 512 MiB

相关文件: 题目目录(样例文件)

题解:对于n*m的矩阵,通过转置和重塑操作都可以使得矩阵形态变为m*n。我们先在脑海里用一维数组存储n*m的矩阵行主序信息和列主序信息,再将其分别进行转置和重塑操作后,比较新的到的m*n矩阵,会发现进行重塑操作不改变矩阵的行主序信息,转置操作则会改变原行主序为列主序。

此时,这道题的思路就出来了,考虑到t<10^5且转置操作不超过100次,因此我们可以使用一维数组存储矩阵信息,当重塑时不进行数组上的操作,仅记录当前重塑后的行和列的值,当转置时,使用一次二重循环将行主序数组转化为列主序数组。最后依靠行列坐标于一维数组下标之间的对应关系输出即可

参考代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,t;cin>>n>>m>>t;
    int b[10010];
    int c[10010];
    for(int i=0;i<n*m;i++)
    {
        cin>>b[i];
        c[i]=b[i];
    }
    int row=n,line=m;
    for(int i=0;i<t;i++)
    {
        int op,x,y;cin>>op>>x>>y;
        if(op==1)
        {
            row=x;line=y;
        }
        else if(op==2)
        {
            int d[line+1][row+1];
            for(int j=0;j<row;j++)
            {
                for(int k=0;k<line;k++)
                {
                    c[k*row+j]=b[j*line+k];
                }
            }
            for(int j=0;j<n*m;j++)
            {
                b[j]=c[j];
            }
            int temp=row;
            row=line;line=temp;
        }
        else if(op==3)
        {
            cout<<b[x*line+y]<<endl;
        }
    }
    return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值