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;
    }
  • 相关阅读:
    使用Code First Migrations依据代码更新数据库结构
    Engine Yard增加对Node.js的支持
    CSS3无前缀脚本prefixfree.js及Animatable介绍
    html5客户端本地存储之sessionStorage及storage事件
    cctype,string,vector
    管理朋友信息程序
    三位数的排列组合
    结构体字节对齐
    习题3.13
    OPENCV用户手册之图像处理部分(之一):梯度、边缘与角点(中文翻译)
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3586815.html
Copyright © 2011-2022 走看看