算法提高 计算行列式
时间限制:1.0s 内存限制:256.0MB
问题描述
//据说很多人的题目会有一大堆废话,本傻×就不在这里废话了。
给定一个N×N的矩阵A,求|A|。
输入格式
第一行一个正整数N。
接下来N行,每行N个整数,第i行第j个数字表示A[i][j]。
输出格式
一行,输出|A|。
样例输入
2
1 2
3 4
样例输出
-2
数据规模和约定
0<N≤6
-10≤A[i][j]≤10
分析:利用拉普拉斯展开定理递归的求行列式的值。设是一个的矩阵,关于第行第列的余子式是指中去掉第行第列后得到的阶子矩阵的行列式。而关于第行第列的代数余子式则为。于是拉普拉斯展开是指对于任意:
#include <stdio.h>
struct Matrix
{
int dim;
int data[8][8];
};
int compute_determinant(struct Matrix mat)
{
if (mat.dim == 1)
return mat.data[0][0];
int ans = 0;
for (int j = 0, sign = 1; j < mat.dim; ++j, sign = -sign)
{
struct Matrix cofactor;
cofactor.dim = mat.dim - 1;
for (int s = 1; s < mat.dim; ++s)
{
for (int r = 0; r < j; ++r)
cofactor.data[s - 1][r] = mat.data[s][r];
for (int r = j + 1; r < mat.dim; ++r)
cofactor.data[s - 1][r - 1] = mat.data[s][r];
}
ans += sign * mat.data[0][j] * compute_determinant(cofactor);
}
return ans;
}
int main()
{
struct Matrix mat;
scanf("%d", &mat.dim);
for (int i = 0; i < mat.dim; ++i)
for (int j = 0; j < mat.dim; ++j)
scanf("%d", &mat.data[i][j]);
printf("%d", compute_determinant(mat));
return 0;
}