-
Notifications
You must be signed in to change notification settings - Fork 0
/
permutaciones.c
144 lines (112 loc) · 3.93 KB
/
permutaciones.c
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
*
* Descripcion: Implementacion de funciones de generacion de permutaciones
*
* Fichero: permutaciones.c
* Autor: Carlos Aguirre
* Version: 1.0
* Fecha: 16-09-2017
*
*/
#include "permutaciones.h"
#include "stdlib.h"
#include "stdio.h"
/***************************************************/
/* Funcion: aleat_num Fecha:13/10/2017 */
/* Autores: */
/* Adrian Rubio */
/* */
/* Rutina que genera un numero aleatorio */
/* entre dos numeros dados */
/* */
/* Entrada: */
/* int inf: limite inferior */
/* int sup: limite superior */
/* Salida: numero aleatorio */
/* int: numero aleatorio */
/***************************************************/
int aleat_num(int inf, int sup)
{
int num_ale1;
num_ale1 = ((rand()/(RAND_MAX + 1.) ) * (sup - inf + 1)) + inf;
return num_ale1;
}
/***************************************************/
/* Funcion: genera_perm Fecha:13/10/2017 */
/* Autores: */
/* Adrian Rubio */
/* */
/* Rutina que genera una permutacion */
/* aleatoria */
/* */
/* Entrada: */
/* int n: Numero de elementos de la */
/* permutacion */
/* Salida: */
/* int *: puntero a un array de enteros */
/* que contiene a la permutacion */
/* o NULL en caso de error */
/***************************************************/
int* genera_perm(int N){
int i, aux, num_ale;
int * perm;
if(!N){
return NULL;
}
perm = (int *) calloc (N, sizeof(int));
if(perm == NULL){
return NULL;
}
for(i=0; i < N; i++){
perm[i] = i+1;
}
for(i = 0; i < N; i++){
aux = perm[i];
num_ale = aleat_num(i, (N-1));
perm[i] = perm[num_ale];
perm[num_ale] = aux;
}
return perm;
}
/***************************************************/
/* Funcion: genera_permutaciones Fecha:13/10/2017 */
/* Autores: */
/* Adrian Rubio */
/* */
/* Funcion que genera n_perms permutaciones */
/* aleatorias de tamanio elementos */
/* */
/* Entrada: */
/* int n_perms: Numero de permutaciones */
/* int N: Numero de elementos de cada */
/* permutacion */
/* Salida: */
/* int**: Array de punteros a enteros */
/* que apuntan a cada una de las */
/* permutaciones */
/* NULL en caso de error */
/***************************************************/
int** genera_permutaciones(int n_perms, int N)
{
int i,j;
int ** g_perm;
if(!N || !n_perms){
return NULL;
}
g_perm = (int **) calloc (n_perms, sizeof(int*));
if(g_perm == NULL){
return NULL;
}
for(i=0 ; i<n_perms ; i++){
g_perm[i] = genera_perm(N);
/*CdE*/
if(g_perm[i] == NULL){
for(j=0; j<i; j++){
free(g_perm[j]);
}
free(g_perm);
return NULL;
}
}
return g_perm;
}