算法题练习(三)----矩阵的k次幂

题目

import java.util.*;
import java.io.*;
public class Main{
    /** * [power description] 矩阵幂运算函数 * 1)首先取得矩阵的阶 * 2)创建结果矩阵,原封不动复制原矩阵 * 3)做k次矩阵幂乘 * 4)模拟矩阵乘法的过程,首先循环行,再循环列,再循环每个数 * 5)每行产生一个长度为n的数组,每列产生一个数 * 6)最后返回结果矩阵 * @param matrix [description] * @param k [description] * @return [description] */
    public static int[][] power(int[][] matrix,int k){
        int n = matrix.length;
        int[][] result = new int[n][n];
        for(int i=0;i<n;i++){
            System.arraycopy(matrix[i],0,result[i],0,n);
        }
        for(int num=0;num<k-1;num++){
            for(int i=0;i<n;i++){
                int[] row = new int[n];
                for(int j=0;j<n;j++){
                    int sum =0;
                    for(int m=0;m<n;m++){
                        sum += result[i][m] * matrix[m][j];
                    }
                    row[j] = sum;
                }
                System.arraycopy(row,0,result[i],0,n);
            }
        }
        return result;
    }
    public static void printMat(int[][] matrix){
        int n = matrix.length;
        for(int i=0;i<n;i++){
            StringBuilder sb = new StringBuilder();
            for(int j=0;j<n;j++){
                if(j != n-1){
                    sb.append(matrix[i][j]).append(" ");
                }else{
                    sb.append(matrix[i][j]);
                }
            }
            System.out.println(sb);
        }
    }


    public static void main(String[] args) {
        Scanner sn = new Scanner(System.in);
        while(sn.hasNextInt()){
            int num = sn.nextInt();
            for(int i=0;i<num;i++){
                int n = sn.nextInt();
                int k = sn.nextInt();
                int[][] mat = new int[n][n];
                for(int j=0;j<n;j++){
                    for(int m=0;m<n;m++){
                        mat[j][m] = sn.nextInt();
                    }
                }
                int[][] result = power(mat,k);
                printMat(result);
            }

        }

    }
}
点赞