1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<algorithm>
using namespace std ;
int main()
{
int n ;
cin>>n;
int d[n][n];
int u[n];
int mul = 1 ;
int sum = 0 ;
int k = 0 ;
for(int i = 1; i<=n ; i++)
for(int j = 1 ; j<=n ; j++)
cin>>d[i][j];
for(int i = 1 ; i <= n ; i++ )
u[i] = i ;
do{
mul = 1 ;
k = 0 ;
for(int i = 1; i <= n ; i++)
mul*=d[i][u[i]];
for(int i = 1; i <= n ; i++)
for(int j = i+1 ; j <= n ; j++)
if(u[j]-u[i] < 0)
k+=1;
if(k%2 == 0) mul = mul ;
else mul= mul * -1 ;
sum += mul ;
}while(next_permutation(u+1,u+1+n));
cout << sum << endl ;
return 0 ;
}

这个程序本质上是对n阶行列式计算公式的模拟,模拟过程分为三步:

1.通过横角标或纵角标的全排列找出所有项

2.求出每次全排列中的逆序数并判断奇偶性

3.通过奇偶性决定项的正负并将所有项加总

没什么设计上的精巧,主要应用了next_permutation这个算法来遍历全排列。