用全排列的方式求行列式的值,递归体现在全排列中,上代码
f函数是求行列式的值
#include<iostream>
#define iIN(x,y) for(int i=x;i<y;i++)
#define jIN(x,y) for(int j=x;j<y;j++)
using namespace std;
int get_ni(int a[],int length) //得到序列a的逆
{
int res=0;
iIN(1,length)
{
jIN(0,i)
{
if(a[j]>a[i])res++;
}
}
return res;
}
void all_sort(int a[],int now,int length,int(*metrix)[10],int &res)
{
if(now==length-1)
{
int ji=1;
for(int i=0;i<length;i++)
{
ji*=metrix[i][a[i]];
}
if(get_ni(a,length)%2==0)res+=ji;
else res-=ji;
}
for(int i=now;i<length;i++)//a[now]与a[i]作交换
{
swap(a[now],a[i]);
all_sort(a,now+1,length,metrix,res);
swap(a[now],a[i]);
}
}
int f(int (*metrix)[10],int x) //metrix代表二维数组
{
//求行列式a(x行x列)值
//算法是 sum{ (-1)^t a[0][p1]*a[1][p2]*a[2][p3]* ...... }
//t是p1 p2 p3的逆序数
int res=0;
int* L=new int[x];
iIN(0,x)
{
L[i]=i;
}
all_sort(L,0,x,metrix,res);
delete []L;
cout<<res<<endl;
}
int main()
{
int a[4][10]={{3,1,1,1},{1,3,1,1},{1,1,3,1},{1,1,1,3}};
f(a,4);
return 0;
}