矩阵幂

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

解题关键是矩阵乘法

vector<vector<int>> mul(vector<vector<int>> a, vector<vector<int>> b)
{
  vector<vector<int>> temp(n, vector<int>(n, 0)) ;
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      for(int k = 0; k < n; k++)
        temp[i][j] += a[i][k] * b[k][j];
  return temp;
}

代码

#include <iostream>
#include <vector>

using namespace std;

int n, k;

vector<vector<int>> mul(vector<vector<int>> a, vector<vector<int>> b)
{
  vector<vector<int>> temp(n, vector<int>(n, 0)) ;
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      for(int k = 0; k < n; k++)
        temp[i][j] += a[i][k] * b[k][j];
  return temp;
}

int main()
{
  cin >> n >> k;
  vector<vector<int>> a(n, vector<int>(n));
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      cin >> a[i][j];
  
  vector<vector<int>> res(n, vector<int>(n, 0));
  for(int i = 0; i < n; i++)res[i][i] = 1;
  for(int i = 0; i < k; i++)
    res = mul(res, a);
  
  for(int i = 0; i < n; i++)
  {
    for(int j = 0; j < n; j++)
      cout << res[i][j] << " "; 
    puts("");
  }
  return 0;
}

旋转矩阵

任意输入两个 9 阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵(顺时针),如果是,输出旋转角度(0901802700、90、180、270),如果不是,输出 −1

解题关键是如何将矩阵旋转90°。 模拟就行

vector<vector<int>> rotate(vector<vector<int>> a)
{
  vector<vector<int>> t(n, vector<int>(n));
  for(int i = 0; i < n; i++)
    for(int j = 0, k = n - 1; j < n; j++, k--)
      t[i][j] = a[k][i];
      
  return t;
}

代码

#include <iostream>
#include <vector>

using namespace std;
const int N = 10;

int n;
vector<vector<int>> rotate(vector<vector<int>> a)
{
  vector<vector<int>> t(n, vector<int>(n));
  for(int i = 0; i < n; i++)
    for(int j = 0, k = n - 1; j < n; j++, k--)
      t[i][j] = a[k][i];
      
  return t;
}

int main()
{
  cin >> n;
  vector<vector<int>> a(n, vector<int>(n));
  vector<vector<int>> b(n, vector<int>(n));
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      cin >> a[i][j];
  for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
      cin >> b[i][j];
  
  int ans = 0;
  for(int i = 0; i < 4; i++)
  {
    if( a == b )
    {
      cout << i * 90 << endl;
      return 0;
    }
    a = rotate(a);
  }
  puts("-1");
  return 0;
}