线代的计算行列式想偷个懒,于是就有了下面的代码,整体是通过递归来实现的
我可真是个小机灵鬼儿hhh
代码中如有纰漏之处还望多多指正!
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
using namespace std;
int Matrix[100][100];
int reduce_order(vector<vector<int> > vec, int n)//降阶函数
{
if(n == 1)//递归终止条件
{
return vec[0][0];
}
else
{
int sum = 0 ;
for(int i = 0 ; i < n; i++)//默认以第一行的代数余子式进行展开
{
vector < vector < int > > s;
for(int j = 1 ; j < n ; j++)//记住从第二行开始,因为第一行由于降阶已经被消去了
{
vector<int> t;
for(int k = 0 ; k < n ; k++)
{
if(k != i)//第i列被消去,不予计算
{
t.push_back(vec[j][k]);
}
}
s.push_back(t);
}
sum += pow(-1, i) * vec[0][i] * reduce_order(s, n-1);//核心
}
return sum;
}
}
int main()
{
vector<vector<int> > vec;//这样做虽然可能会慢一丢丢,但是整行整列好操作
int n;
while(cin>>n)
{
vec.clear();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin>>Matrix[i][j];
}
}
for(int i = 0; i < n; i++)
{
vector<int> t;
for(int j = 0; j < n; j++)
{
t.push_back(Matrix[i][j]);
}
vec.push_back(t);
}
cout<<reduce_order(vec,n)<<endl;
}
return 0;
}