|
[ SuperC @ 12.11.2006. 13:29 ] @
| Trazeno mi je da tri broja, recimo 123, permutiram u svim mogucim oblicima, znaci da dobijem kao rjesenje 123 132 213 231 312 321, ja sam napisao nesto, Dev ne prijavljuje gresku, no Dev jos nisam uspio podesiti kako treba te ne mogu prakticno unijeti tri broja i vidjeti kako to funkcionise, ne znam da li moze jednostavnije, no evo sta sam ja napravio:
Code:
#include <stdio.h>
void print(const int *v, const int size)
{
if (v != 0)
{
for (int i = 0; i < size; i++)
{
printf("%4d", v[i] );
}
printf("\n");
}
} // print
void permute(int *v, const int start, const int n)
{
if (start == n-1)
{
print(v, n);
}
else {
for (int i = start; i < n; i++)
{
int tmp = v[i];
v[i] = v[start];
v[start] = tmp;
permute(v, start+1, n);
v[start] = v[i];
v[i] = tmp;
}
}
}
main()
{
int v[] = {1, 2, 3, 4};
permute(v, 0, sizeof(v)/sizeof(int));
}
EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:
[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]
Tako uokviren (formatizovan) kod će se videti ovako:
Code:
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[Ovu poruku je menjao X Files dana 12.03.2007. u 19:17 GMT+1] |
[ SambucusELF @ 11.03.2007. 16:57 ] @
ako sam dobro razumeo permutacije od 3 broja!
možda da probaš ovako:
Code:
#include <iostream.h>
int n,i,j,k;
int brojevi[];
int main(int argc, char* argv[])
{
cout << "Unesite koliko ima brojeva:"
cin >> (int) n;
for (i=0;i<n;i++)
{
cout << "Unesite " << i+1 << ". broj:\n"
cin >> (int) brojevi[i];
}
cout << "Permutacije su:\n";
for (i=0;i<n;i++)
for (j=i+1;j<n;j++)
for (k=j+1;k<n;k++)
cout << brojevi[i]<< brojevi[j] << brojevi[k]<<"\n";
}
ili tako nesto...
[ NrmMyth @ 11.03.2007. 17:27 ] @
Code: std::next_permutation()
[ leka @ 14.03.2007. 22:23 ] @
SuperC, cisto sumnjam da si ti "napravio" kod iz tvog teksta, jer to je "u bajt" kopija "University of Exeter" algoritma za generisanje permutacija...
[ leka @ 14.03.2007. 22:52 ] @
Pre nego dam kod, da odgovorim kratko - moze jednostavnije, ali nije efikasno resenje. Najjednostavnije resenje za generisanje permutacija je definitivno nekakvo rekurzivno resenje...
Evo jako dobrog (citaj brzog) resenja bez rekurzije:
Code:
#include <iostream>
/*
r n!
P = -------
n (n-r)!
U nasem slucaju n = r = 0, tako da je broj permutacija zapravo n!.
Recimo da imamo na ulazu niz od 3 elementa {1,2,3}, broj permutacija je 3!, dakle 6.
*/
using namespace std;
void stampajNiz(unsigned int arg[], int size) {
for (int x=0; x<size; x++)
cout << arg[x] << " ";
cout << endl;
} // stampajNiz()
void permutacije(int n)
{
unsigned int a[n], p[n+1];
register unsigned int i, j, tmp;
// inicijalizuj nizove
for(i = 0; i < n; i++) {
a[i] = i + 1;
p[i] = i;
} // for
stampajNiz(a, n); // odstampaj inicijalni niz
p[n] = n;
i = 1;
while(i < n) {
p[i]--;
j = i % 2 * p[i]; // ako je i neparan, onda j = p[i], inace j = 0
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
i = 1;
while (!p[i]) {
p[i] = i;
i++;
} // while
stampajNiz(a, n);
} // while
} // permutacije()
int main()
{
permutacije(3);
return 0;
} // main()
Primer izlaza
dlekic@calcium ~/prj/cpp/work $ ./permutation
1 2 3
2 1 3
3 1 2
1 3 2
2 3 1
3 2 1
[Ovu poruku je menjao leka dana 15.03.2007. u 00:03 GMT+1]
[ 1jedini @ 15.03.2007. 09:37 ] @
Code:
#include <iostream>
#include <iomanip>
using namespace std;
void ucitaj( int *a, int*b, int *c ) //! znam, znam, mogu i reference
{
cin >> *a;
cin >> *b;
cin >> *c;
cin.get();
}
void obradi( int const& a, int const& b, int const& c )
{
cout << a <<"; "<< b << "; " << c << endl;
}
int main( int argc, char *argv[])
{
int a,b,c;
ucitaj(&a,&b,&c);
obradi(a,b,c);
obradi(a,c,b);
obradi(b,a,c);
obradi(b,c,a);
obradi(c,a,b);
obradi(c,b,a);
cin.get();
return 0;
}
Ovo je ujedno i najbrze resenje.
Slicno je i za 4,5,6,...
Ako je broj elemenata nepoznat u vrajt-tajmu onda je resenje ( idejno gledano ) drugacije od predhodno pomenutog.
[ Mali Misha @ 15.03.2007. 10:23 ] @
Ako ćemo već u tom smeru, funkcije mogu biti inline ili makroi. Tako se štedi i (inače beznačajno) vreme za njihove pozive.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|