zoukankan      html  css  js  c++  java
  • 九度 1474:矩阵幂(二分法)

    题目描述:

    给定一个n*n的矩阵,求该矩阵的k次幂,即P^k

    思路

    1. 和求解整数幂的思路相同, 使用分治策略, 代码的框架是

    int pow(a, b) {

      c = pow(a, b/2)

      c*= c;

      if(b 为奇数)

        c *= a;

      return c

    }

    2. 这道题求的是矩阵, 上面的框架不太好用, 毕竟返回一个矩阵是有点不靠谱. 既然显式的返回矩阵不行, 那就玩个把戏, 隐式返回.

    将矩阵设置为全局变量, 使得递归函数里对矩阵的操作全局有效, 就不需要显式返回矩阵了

    3. 尝试仅使用两个矩阵得出结果, 但失败了, 计算矩阵乘法, 至少需要三个矩阵的空间吧

    代码

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    int matrix1[12][12];
    int matrix2[12][12];
    int matrix3[12][12];
    
    int n, k;
    
    void multimatrix(int x) {
        if(x == 1)
            return;
    
        multimatrix(x/2);
    
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < n; j ++) {
                int grid = 0;
                for(int k = 0; k < n; k ++) {
                    grid += matrix2[i][k]*matrix2[k][j];
                }
    
                matrix3[i][j] = grid;
            }
        }
    
        for(int i = 0; i < n; i ++) {
            for(int j = 0; j < n; j ++) {
                matrix2[i][j] = matrix3[i][j];
            }
        }
    
        if(x&1) {
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    int grid = 0;
                    for(int k = 0; k < n; k ++) {
                        grid += matrix2[i][k]*matrix1[k][j];
                    }
                    matrix3[i][j] = grid;
                }
            }
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    matrix2[i][j] = matrix3[i][j];
                }
            }
        } 
    }
    
    int main() {
        int t;
        scanf("%d", &t);
        for(int i = 0; i < t; i ++) {
            scanf("%d%d", &n, &k);
    
            for(int i = 0; i < n; i ++) {
                for(int j = 0; j < n; j ++) {
                    scanf("%d", &matrix1[i][j]);
                    matrix2[i][j] = matrix1[i][j];
                }
            }
    
            multimatrix(k);
    
            for(int i = 0; i < n; i ++) {
                printf("%d", matrix2[i][0]);
                for(int j = 1; j < n; j ++) {
                    printf(" %d", matrix2[i][j]);
                }
                printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Android导出jar包后的资源使用问题
    怎样设计接口?
    自己动手写shell之chgrp,chown,chmod
    妹子图太多怎么看才好,Swing来支招
    Etcd学习(一)安装和.NETclient測试
    js中return false,return,return true的使用方法及区别
    C语言运算符的优先级
    运动物体检测与跟踪——累积权重构建背景模型
    推理集 —— 现场的观察
    推理集 —— 现场的观察
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3586815.html
Copyright © 2011-2022 走看看