#include <iostream>
#include <vector>
#include <pthread.h>
#define size 4
using
namespace
std;
int
mat[][size] = { { 0, 4, 0, -3 },
{ 1, 1, 5, 2 },
{ 1, -2, 0, 6 },
{ 3, 0, 0, 1 } };
int
det[size];
pthread_t
thread
[size];
int
determinant(vector<vector<
int
> > mat2,
int
s)
{
if
(s == 2) {
return
mat2[0][0] * mat2[1][1] -
mat2[0][1] * mat2[1][0];
}
else
{
vector<vector<
int
> > mat1(s - 1),
mat3(s - 1), mat4(s - 1);
int
k, l, m, i, j;
for
(i = 0; i < s - 1; i++) {
mat1[i] = vector<
int
>(s - 1);
mat3[i] = vector<
int
>(s - 1);
mat4[i] = vector<
int
>(s - 1);
}
for
(i = 1; i < s; i++) {
k = 0;
l = 0;
m = 0;
for
(j = 0; j < s; j++) {
if
(j != 0) {
mat1[i - 1][k] = mat2[i][j];
k++;
}
if
(j != 1) {
mat3[i - 1][l] = mat2[i][j];
l++;
}
if
(j != 2) {
mat4[i - 1][m] = mat2[i][j];
m++;
}
}
}
return
mat2[0][0] * determinant(mat1, s - 1) -
mat2[0][1] * determinant(mat3, s - 1) +
mat2[0][2] * determinant(mat4, s - 1);
}
}
void
* createTd(
void
* arg)
{
int
*ar = (
int
*)arg, i, j, k;
vector<vector<
int
> > mat2(size - 1);
for
(i = 0; i < size - 1; i++)
mat2[i] = vector<
int
>(size - 1);
for
(i = 1; i < size; i++) {
k = 0;
for
(j = 0; j < size; j++) {
if
(j != (*ar)) {
mat2[i - 1][k] = mat[i][j];
k++;
}
}
}
det[*ar] = det[*ar] * determinant(mat2, size - 1);
}
int
main()
{
int
i, j, detfin = 0;
int
p[size];
for
(i = 0; i < size; i++)
det[i] = mat[0][i];
for
(i = 0; i < size; i++) {
p[i] = i;
pthread_create(&
thread
[i], NULL, &createTd, (
void
*)&p[i]);
}
pthread_join(
thread
[0], NULL);
pthread_join(
thread
[1], NULL);
pthread_join(
thread
[2], NULL);
pthread_join(
thread
[3], NULL);
for
(i = 0; i < size; i++) {
if
(i % 2 == 0)
detfin += det[i];
else
detfin -= det[i];
}
cout << detfin << endl;
return
0;
}