用递归来写:
#include<iostream>
using namespace std;
const int N=15;
int n,a[N][N],col[N];
int det(int m,int l){
if(m==1)
for(int i=0;i<n;i++)
if(!col[i]){
return a[l][i];
}
int res=0,r=0,c=0;
for(int i=0;i<n;i++){
if(col[i]) continue ;
col[i]=1;
int t=det(m-1,l+1);
if((r+c)%2==0) res+=a[l][i]*t;
else res-=a[l][i]*t;
c++;
\\if(c==m) r++,c=0;
col[i]=0;
}
return res;
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
printf("%d\n",det(n,0));
return 0;
}
不需要开辟额外的空间 只需要记录被划掉的列即可
r和c记录的是划掉后新的行列式的行和列 用于计算代数余子式前面的系数 即当(r+c)为奇数时,代数余子式应该在余子式前面填负号 而由于只会处理一行 所以关于列的判断可以省略
det函数中第一个参数代表当前所求行列式的阶数 第二个参数代表当前所求行列式第一行在所求行列式所在的行数
当计算到第n阶 第i行的行列式时 按第i行展开可将其化为n-1阶行列式 而由于该行已经划掉 所以下面的行数变为i+1行
注意当退出第n阶时 要将第n阶划掉的列数恢复 而返回n阶上一阶时 行数会自动恢复
测试样例:
输出结果:7583304