1.沙路法求二三阶行列式
#include<iostream>
using namespace std;
const int N=1000;
int arr[N][2*N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&arr[i][j]);
}
}
for(int i=0;i<n;i++)
{
for(int j=n;j<2*n-1;j++)
{
arr[i][j]=arr[i][j-n];
}
}
int sum=0;
for(int i=0;i<n;i++)
{
int res=1;
for(int r=0,c=i;r<n;r++,c++)
{
res=res*arr[r][c];
}
sum=sum+res;
}
for(int i=0;i<n;i++)
{
int res=1;
for(int r=n-1,c=i;r>=0;r--,c++)
{
res=res*arr[r][c];
}
sum=sum-res;
}
printf("%d",sum);
return 0;
}
2.全排列暴力求解
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1000;
int arr[N],s[N][N];
int n;
int change(int arr[])
{
int count=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(arr[j]>arr[i]) count++;
}
}
if(count%2==0) return 0;
else return 1;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++) arr[i]=i;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&s[i][j]);
}
}
int sum=1;
for(int i=0;i<n;i++) sum=sum*s[i][i];
while(next_permutation(arr,arr+n))
{
int res=1;
for(int i=0;i<n;i++)
{
res=res*s[i][arr[i]];
}
if(change(arr)==0) sum=sum+res;
else sum=sum-res;
}
printf("%d",sum);
return 0;
}