ho bisogno di scrivere una funzione che dato un vettore di interi mi stampi tutte le possibili combinazioni a k a k per ogni k; esempio se ho un vettore di 5 elementi 1,2,3,4,5 con k=3 avrei:
123,124,125,134,135,145,234,235,245,345
ho trovato in rete questo algoritmo, se mi potete dare una mano a tradurlo in c ve ne sarei molto grato...
comb40()
Prgm
Local i,j
DelVar cc
true->kappa
immiss()
false->kappa
8->ri:8->co
ClrIO
Define combinas()=Prgm
k->i
While i>=1
If aa[i]<n-k+i Then
aa[i]+1->aa[i]
For j,i+1,k
aa[j-1]+1->aa[j]
EndFor
0->i
EndIf
i-1->i
EndWhile
EndPrgm
Define tutte()=Prgm
Loop
aa->bb
combinas()
If not copia(aa,bb,k) Then
stampa(aa,ri,co,k)
co+48->co
If co>235 Then
ri+18->ri:8->co
EndIf
Else
Exit
EndIf
EndLoop
EndPrgm
stampa(aa,ri,co,k)
co+48->co
tutte()
EndPrgm
Per n=3 e k=2
- edenslave
- Ingegneria Informatica - Triennale
- Martedì, 21 Giugno 2005
- Subscribe via email
Comment
There are no comments made yet.
Accepted Answer
Pending Moderation
Per generare tutte le possibili combinazioni puoi provare questo codice C:
[code type="markup"]#include <stdio.h>
#define MAP_BUSY 1
#define MAP_FREE 0
void __stampa(int* array, short* bitmap, const int size, int* save, const int k) {
int i, hold;
static int index = 0, offset = 0;
if(index == k) {
for(i=0;i<k;i++) printf("%d", save[i]);
printf("\n"
;
return;
}
hold = offset;
for(i=hold;i<size;i++) {
if(bitmap[i]==MAP_BUSY) continue;
save[index] = array[i];
offset = i+1;
bitmap[i] = MAP_BUSY;
index++;
__stampa(array, bitmap, size, save, k);
index--;
bitmap[i] = MAP_FREE;
}
offset = hold;
}
void stampa(int* array, int size, int k) {
short bitmap[size];
int save[k], i;
if(k<=0 || k > size) return;
for(i=0;i<size;i++) bitmap[i] = MAP_FREE;
__stampa(array, bitmap, size, save, k);
}
int main() {
int array[] = {1,2,3,4,5};
int k = 3;
stampa(array, 5, k);
return 0;
}[/code]
[code type="markup"]#include <stdio.h>
#define MAP_BUSY 1
#define MAP_FREE 0
void __stampa(int* array, short* bitmap, const int size, int* save, const int k) {
int i, hold;
static int index = 0, offset = 0;
if(index == k) {
for(i=0;i<k;i++) printf("%d", save[i]);
printf("\n"
return;
}
hold = offset;
for(i=hold;i<size;i++) {
if(bitmap[i]==MAP_BUSY) continue;
save[index] = array[i];
offset = i+1;
bitmap[i] = MAP_BUSY;
index++;
__stampa(array, bitmap, size, save, k);
index--;
bitmap[i] = MAP_FREE;
}
offset = hold;
}
void stampa(int* array, int size, int k) {
short bitmap[size];
int save[k], i;
if(k<=0 || k > size) return;
for(i=0;i<size;i++) bitmap[i] = MAP_FREE;
__stampa(array, bitmap, size, save, k);
}
int main() {
int array[] = {1,2,3,4,5};
int k = 3;
stampa(array, 5, k);
return 0;
}[/code]
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 1
Accepted Answer
Pending Moderation
GRAZIE!!!una cosa...
da quel poco che ne capisco mi sembra che lo short int BITMAP non serve a niente...o sbaglio?
da quel poco che ne capisco mi sembra che lo short int BITMAP non serve a niente...o sbaglio?
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 2
Accepted Answer
Pending Moderation
No, invece quella struttura dati è essenziale! Quello che ti ho scritto è un algoritmo ricorsivo di profondità k che genera tutte le possibili combinazioni. L'array bitmap ha la stessa dimensione dell'array di partenza ed una mappa usata per indicare tutti gli elementi dell'array già utilizzati (MAP_BUSY) nella combinazione in corso di generazione oppure ancora disponibili (MAP_FREE). E' grazie a tale struttura che ad ogni passo della ricorsione è possibile capire quali elementi non sono stati ancora presi in considerazione. L'array è di tipo short (usato in C al posto di boolean). Spero di essere stato chiaro. Ciao.
Comment
There are no comments made yet.
- more than a month ago
- Ingegneria Informatica - Triennale
- # 3
- Page :
- 1
There are no replies made for this post yet.
Be one of the first to reply to this post!
Be one of the first to reply to this post!
Please login to post a reply
You will need to be logged in to be able to post a reply. Login using the form on the right or register an account if you are new here. Register Here »