fbpx
Skip to main content
  1. edenslave
  2. Ingegneria Informatica - Triennale
  3. Martedì, 21 Giugno 2005
  4.  Subscribe via email
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
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]
Comment
There are no comments made yet.
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?
Comment
There are no comments made yet.
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.
  • Page :
  • 1


There are no replies made for this post yet.
Be one of the first to reply to this post!