• acwing 1336. 矩阵(模拟)


    题目传送门

    题目描述

    矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。

    在物理学中,矩阵于电路学、力学、光学和量子物理中都有应用;计算机科学中,三维动画制作也需要用到矩阵。

    矩阵的运算是数值分析领域的重要问题。

    你需要维护一个元素均为正整数的 nn 阶矩阵,并支持以下几种操作:

    1. 将该矩阵转置,即沿主对角线翻转。
    2. 将该矩阵行循环移动kk次,即第11行移动至第k+1k+1行,第22行移动至第k+2k+2行……,第n−k+1n−k+1行移动至第11行……,第nn行移动至第kk行。
    3. 将该矩阵列循环移动kk次,即第11列移动至第k+1k+1列,第22列移动至第k+2k+2列……,第n−k+1n−k+1列移动至第11列……,第nn列移动至第kk列。

    输入格式

    第一行一个正整数 nn 表示矩阵大小。

    随后 nn 行每行 nn 个空格隔开的整数,表示矩阵中的元素。

    随后一行一个正整数 qq 表示操作次数。

    随后 qq 行每行表示一个操作,形如 11 或 22 kk 或 33 kk。

    输出格式

    对于每组数据,输出 nn 行每行 nn 个空格隔开的整数,表示依次进行所有操作后矩阵中的元素。

    数据范围

    对于30%30%的数据,保证n,q≤10n,q≤10。

    对于另外20%20%的数据,保证只有操作11。

    对于100%100%的数据,保证1≤n,q≤1001≤n,q≤100,0≤k<n0≤k<n,矩阵中元素的值不超过109109。

    输入样例:

    2
    1 2
    3 4
    2
    1
    2 1
    

    输出样例:

    2 4
    1 3
    

    模拟

    分析

    只实现行的循环移动

    对于列的循环移动只需要:

    • 先转置
    • 然后行循环移动
    • 在转置

    代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N = 110;
    int g[N][N];
    int tmp[N][N];
    int n, q;
    
    void zhuanz()
    {
    	for(int i = 1; i <= n; i++)
    		for(int j = i; j <= n; j++)
    			swap(g[i][j], g[j][i]);
    }
    
    void row_shift(int k)
    {
    	for(int i = 1; i + k <= n; i++)
    		for(int j = 1; j <= n; j++)
    			tmp[i+k][j] = g[i][j];
    	
    	for(int i = 1; i <= k; i++)
    		for(int j = 1; j <= n; j++)
    			tmp[i][j] = g[n-k+i][j];
    
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= n; j++)
    			g[i][j] = tmp[i][j];
    }
    
    
    void col_shift(int k)
    {
    	zhuanz();
    	row_shift(k);
    	zhuanz();
    }
    
    int main()
    {
    	cin >> n;
    	for(int i = 1; i <= n; i++)
    		for(int j = 1; j <= n; j++)
    			cin >> g[i][j];
    	
    	cin >> q;
    	while(q--)
    	{
    		int t;
    		int k;
    		cin >> t;
    		if(t == 1) zhuanz();
    		else if(t == 2)
    		{
    			cin >> k;
    			row_shift(k);
    		}
    		else 
    		{
    			cin >> k;
    			col_shift(k);
    		}
    //		for(int i = 1; i <= n; i++)
    //		{
    //			for(int j = 1; j <= n; j++) printf("%d ", g[i][j]);
    //			puts("hhh");
    //		}
    	}
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= n; j++) printf("%d ", g[i][j]);
    		puts("");
    	}
    	return 0;
    }
    

    时间复杂度

    参考文章

  • 相关阅读:
    python day6
    python day5
    python基础晋级篇
    python基础篇
    初识Python
    if语句
    A22. openstack架构实战-openstack的api
    A21. openstack架构实战-配置三层网络vxlan
    A20. openstack架构实战-虚拟机创建的流程
    A19. openstack架构实战-云主机的冷迁移
  • 原文地址:https://www.cnblogs.com/VanHa0101/p/16014248.html
Copyright © 2020-2023  润新知