Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
Gost
|
|
[Vrh] |
|
ahri Forumaš(ica)
Pridružen/a: 19. 11. 2003. (23:16:07) Postovi: (193)16
|
Postano: 22:27 pon, 29. 8. 2005 Naslov: |
|
|
evo cijeli kod
[code:1]#include <stdio.h>
#include <string.h>
#define MAX 10
int bio[MAX];
int polje[MAX];
void rek(int p, int n) {
int i;
if (p==0) { /* ako smo popunili polje, ispisi ga! */
for (i=0;i<n;i++)
printf("%d ", polje[i]+1);
printf("\n");
}
for (i=0;i<n;i++) {
if (bio[i]==0) {
bio[i]=1; /* "zabranjujemo" da se ovaj broj ponovi */
polje[p-1]=i; /* upisujemo iduci broj u permutaciji */
rek(p-1, n);
bio[i]=0; /* "dopustamo" da se ovaj broj kasnije ponovo koristi,
posto smo ga vec u svojoj rekurziji na ovom mjestu
vec obradili! - malo razmisliti o ovom djelu :)*/
}
}
}
int main() {
memset(polje, 0, sizeof(polje));
memset(bio, 0, sizeof(bio));
rek(4, 4);
return 0;
}
[/code:1]
onaj memset dio samo resetira oba polja na nulu...
princip je da kad udjes u rekurziju isprobas sve brojeve koji do sad nisu bili upotrebljeni, te kad naidjes na neki takav, stavis ga u polje i pozoves se za polje nize.
(funkciju sam napisao tako da puni polje "odozada", jer je tako lakse isprogramirati).
polje "bio" sluzi tome da lako saznas jesi li neki broj vec koristio, a polje "polje" sluzi ispisu tih permutacija (u nju trpas brojeve kako padas dublje u rekurziju).
funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.
bitno je odmah nakon izlaska iz rekurzije resetirati bio[i] na nulu!
evo cijeli kod
Kod: | #include <stdio.h>
#include <string.h>
#define MAX 10
int bio[MAX];
int polje[MAX];
void rek(int p, int n) {
int i;
if (p==0) { /* ako smo popunili polje, ispisi ga! */
for (i=0;i<n;i++)
printf("%d ", polje[i]+1);
printf("\n");
}
for (i=0;i<n;i++) {
if (bio[i]==0) {
bio[i]=1; /* "zabranjujemo" da se ovaj broj ponovi */
polje[p-1]=i; /* upisujemo iduci broj u permutaciji */
rek(p-1, n);
bio[i]=0; /* "dopustamo" da se ovaj broj kasnije ponovo koristi,
posto smo ga vec u svojoj rekurziji na ovom mjestu
vec obradili! - malo razmisliti o ovom djelu :)*/
}
}
}
int main() {
memset(polje, 0, sizeof(polje));
memset(bio, 0, sizeof(bio));
rek(4, 4);
return 0;
}
|
onaj memset dio samo resetira oba polja na nulu...
princip je da kad udjes u rekurziju isprobas sve brojeve koji do sad nisu bili upotrebljeni, te kad naidjes na neki takav, stavis ga u polje i pozoves se za polje nize.
(funkciju sam napisao tako da puni polje "odozada", jer je tako lakse isprogramirati).
polje "bio" sluzi tome da lako saznas jesi li neki broj vec koristio, a polje "polje" sluzi ispisu tih permutacija (u nju trpas brojeve kako padas dublje u rekurziju).
funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.
bitno je odmah nakon izlaska iz rekurzije resetirati bio[i] na nulu!
_________________
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 22:38 pon, 29. 8. 2005 Naslov: |
|
|
[quote="ahri"]funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio.[/quote]
Danas sam na konzultacijama vidio jedno zanimljivo rjesenje bez polja [tt]bio[/tt], ali i bez trazenja po cijelom polju [tt]polje[/tt]. :D Wanna guess how? :g: (mislim da se ne dobije nista na slozenosti, ali je zanimljjvo 8))
ahri (napisa): | funkciju sam mogao napisati i bez polja "bio", ali bih onda morao svaki puta prekopati polje "polje" kako bi provjerio je li neki broj vec bio. |
Danas sam na konzultacijama vidio jedno zanimljivo rjesenje bez polja bio, ali i bez trazenja po cijelom polju polje. Wanna guess how? (mislim da se ne dobije nista na slozenosti, ali je zanimljjvo )
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
ahri Forumaš(ica)
Pridružen/a: 19. 11. 2003. (23:16:07) Postovi: (193)16
|
Postano: 3:33 pet, 2. 9. 2005 Naslov: |
|
|
npr:
[code:1]
int polje[MAX];
void rek(int p, int n) {
int i;
if (p==0) {
for (i=0;i<n;i++)
printf("%d ", polje[i]);
printf("\n");
}
for (i=0;i<p;i++) {
swap(polje[i], polje[p-1]);
rek(p-1, n);
swap(polje[i], polje[p-1]);
}
}
int main() {
int i, n=4;
for (i=0;i<n;i++)
polje[i]=i;
rek(4, 4);
return 0;
}
[/code:1]
npr:
Kod: |
int polje[MAX];
void rek(int p, int n) {
int i;
if (p==0) {
for (i=0;i<n;i++)
printf("%d ", polje[i]);
printf("\n");
}
for (i=0;i<p;i++) {
swap(polje[i], polje[p-1]);
rek(p-1, n);
swap(polje[i], polje[p-1]);
}
}
int main() {
int i, n=4;
for (i=0;i<n;i++)
polje[i]=i;
rek(4, 4);
return 0;
}
|
_________________
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
ahri Forumaš(ica)
Pridružen/a: 19. 11. 2003. (23:16:07) Postovi: (193)16
|
|
[Vrh] |
|
|