行列式计算
以下用的是代数余子式计算行列式
数学结论:行列式等于它任意一行(列)的各元素与其对应的代数式余子式乘积之和。
\[\left|\begin{matrix}
a_{11} & a_{12} & \cdots & a_{1n} \\
a_{21} & a_{22} & \cdots & a_{2n} \\
\vdots & \vdots & \vdots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nn}
\end{matrix} \right|
=
(-1)^{1 + 1}a_{11}
\left|\begin{matrix}
a_{22} & a_{23} & \cdots & a_{2n} \\
\vdots & \vdots & \vdots & \vdots \\
a_{n2} & a_{n3} & \cdots & a_{nn}
\end{matrix} \right|
+
(-1)^{1 + 2}a_{12}
\left|\begin{matrix}
a_{21} & a_{23} & \cdots & a_{2n} \\
\vdots & \vdots & \vdots & \vdots \\
a_{n1} & a_{n3} & \cdots & a_{nn}
\end{matrix} \right|
+ \cdots +
(-1)^{1 + n}a_{1n}
\left|\begin{matrix}
a_{21} & a_{22} & \cdots & a_{2n-1} \\
\vdots & \vdots & \vdots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nn-1}
\end{matrix} \right|
\]
所以,我们可以直接默认取第一行与其对应的代数余子式的乘积之和,利用递归求出行列式的值。
代码
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 10;
ll a[N][N];
ll cal(ll a[N][N], int n)
{
if (n == 1) return a[1][1]; // 1行1列直接返回该值
ll res = 0;
for (int t = 1; t <= n; t ++) // 枚举第1行的每一列
{
ll na[N][N] = {}; // 余子式
for (int i = 2, ri = 1; i <= n; i ++, ri ++) // 从第2行开始枚举
for (int j = 1, cj = 1; j <= n; j ++, cj ++) // 枚举每一列,除和第一行同一列的数
{
if (j == t) continue; // 同列不选
na[ri][cj] = a[i][j];
}
res += (t % 2 ? 1 : -1) * a[1][t] * cal(na, n - 1); // 将每个代数余子式求和,同时递归求余子式
}
return res;
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
cin >> a[i][j];
cout << cal(a, n);
return 0;
}