imam jedan zadatak u C++ koji bi morao rijesiti,a jednostavno nekuzim kak postaviti zadatak.Ako ima koja dobra dusa da mi pomogne puno bi to cijenio.treba mi rijesiti taj primjer tak da znam učit druge.Ako je potrebno platio bi nekom za trud
zadatak glasi:
Unosi se n E N, n>= 2 paran broj.n predstavlja broj šahista na nekom turniru na kojem svaki šahist igra točno jednu partiju sa svim preostalim šahistima.Program treba ispisati za svako kolo raspored parova.Radi jednostavnosti ne morate voditi računa tko u paru ima bijele a tko crne figure.Šahiste označite brojevima 1,2,....n.
Mali zadatak u C++
- poruka: 19
- |
- čitano: 5.825
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Ja se ne mogu sjetiti nicega osim klasicnog matchinga sto je O ( N^3 ) algoritam gdje je N broj sahista.
Dakle koliko kola imas, jasno je da ih imas N-1.
dakle trebas :
bool par[ MAXN ][ MAXN ] : array koji ce ti reci je li taj par vec bio igran
int uzeo[ MAXN ] : array koji ce ti reci za svako kolo s kime igra x-ti igrac : uzeo[x] -> s kime igra igrac x, a uzeo[uzeo[x]] == x, to je jasno ...
array uzeo refreshas nakon svakog kola i to ti je to...
EDIT : trebas rabiti backtrack, dfs tipa. No slozenost ostaje O ( N^3 ) jer se dfs ponasa kao jos jedna for petlja.
Mislim da je rješenje Round Robin algoritam. Potraži na netu kako se implementira.
Evo implementacija algoritma kojeg sam gore objasio ...
Mozda malo spor, ali radi.
#include <cstdio>
#include <cstring>
bool par[ 100 ][ 100 ], out[ 100 ];
int uzeo[ 100 ];
int N;
bool dfs(int p)
{
if (p > N) return 1;
if (uzeo[p]) return dfs(p+1);
for (int i = 1; i <= N; ++i) {
if (uzeo[i]) continue;
if (par[i][p] || i == p) continue;
uzeo[p] = i;
uzeo[i] = p;
if (dfs(p+1)) return true;
uzeo[p] = 0;
uzeo[i] = 0;
}
return false;
}
int main()
{
memset(par, 0, sizeof par);
scanf("%d", &N);
for (int i = 1; i < N; ++i) {
for (int j = 1; j <= N; ++j)
uzeo[j] = out[j] = 0;
dfs(1);
printf("KOLO : %d\n", i);
for (int j = 1; j <= N; ++j) {
if (!out[j]) printf("%d vs %d\n", j, uzeo[j]);
par[j][uzeo[j]] = 1;
out[uzeo[j]] = 1;
out[j] = 1;
}
}
}
EDIT : Dodano da ispisuje jedan par samo jedanput, napr. ispise 1 vs 2, ali ne i 2 vs 1.
Meni ne izbacuje dobro. U svakom kolu svaki igrač igra vs 0... I isto tako, u istom kolu ne mogu igrati 1 vs 2 a zatim 2 vs 1 (npr. za n = 8).
Daj mi primjer gdje netko igra protiv 0, koliko ja vidim to se dogadja samo pri neparnim brojevima, a u zadatku kaze samo PARNI brojevi. Bas me interesira kao bi ti organizirao ligu sa neparnim brojem klubova ...
Aki igrac 1 igra protiv igraca 2 u 1. kolu tada igrac 2 ne igra protiv ikoga drugoga nego protiv 1, ako bas oces mogu ubaciti jos jedan array da makne taj "mistake".
EDIT : Evo dodao sam i to.
Čemu nervoza?
Slučajno pa i igram šah u ligi i po turnirima i to po ovom sistemu (Round Robin ili švicarski - kako kad). Uglavnom, ako je broj igrača ili klubova neparan tada svaki od njih jedno kolo pauzira. Nikakva mudrost.
Ok, sry ...
imam jedan zadatak u C++ koji bi morao rijesiti,a jednostavno nekuzim kak postaviti zadatak.Ako ima koja dobra dusa da mi pomogne puno bi to cijenio.treba mi rijesiti taj primjer tak da znam učit druge.Ako je potrebno platio bi nekom za trud
zadatak glasi:
Unosi se n E N, n>= 2 paran broj.n predstavlja broj šahista na nekom turniru na kojem svaki šahist igra točno jednu partiju sa svim preostalim šahistima.Program treba ispisati za svako kolo raspored parova.Radi jednostavnosti ne morate voditi računa tko u paru ima bijele a tko crne figure.Šahiste označite brojevima 1,2,....n.
Bilo bi pristojno barem stisnuti gumbić "Hvala" kad ti netko riješi zadatak.....
Evo jedno pitanjce na brzinu.
Ja bih počeo programirati u c++, tj. za par dana stiže mi knjige c++: analiza i primjena pa me zanima koji program da instaliram za programiranje u c++? (visual studio c++?)
I da, koji mi svi programi trebaju za programiranje, znači da mogu kod spremat kao .exe i da sve normalno radi?
Unaprijed hvala, i molio bih vas bez ismijavanja ;)
Microsoftov Visual C++ Express je sve sto ce ti kao pocetniku trebati. Osim knjige i pameti naravno :D
btw. kôd se ne sprema u .exe datoteku onako kako recimo Word sprema svoje datoteke, nego ga prvo kompajler prevodi u strojni jezik, a potom linker datoteke koje je kompajler preveo povezuje sa izvrsnim bibliotekama, te tako dobijes izvrsnu datoteku (.exe).
Aha, ali visual c++ ima i kompajler i sve što mi treba.
Sve ima, ne moras se zamarati tim tehnikalijama jos, bit ce vremena kasnije i za to...
Samo si skini VS i pocni uciti.
Budimire hvala na sastavljanju algoritma :)
Napisao bi ranije zahvalu ali nisam bio pri računalu zbog privatnih problema.
e sad imam jos jedan problemcic,a to je da kad C/P ovaj program sto si napisao meni se nista ne događa.unesem broj parova i program se ugasi
Ovo je tipični primjer zašto početnicima ne valja davati gotova rješenja kada nisu upoznati niti s osnovama tj. kako se uopće pokreće program.
Tracer je upravu, nema smisla. Ja pisem poprilicno naprednu implementaciju algoritma, a ti niti program ne znas pokrenuti ...
Ja sam prvo imao namjeru samo opisati algoritam sto sam napravio u prvom postu, no kasnije sam i sam htio implementirati rjesenje.
Bio sam uvjeren da autor teme zna programirati jer ovakav zadatak nije bas namjenjen pocetnicima ...
Prijatelju dali možeš dodati jos jedno kolo dodatno, tako da moze biti i neparan broj igrača. Kada je neparan da svaki puta drugi igrač odmara... :)
hvala unaprijed :D
Ako je neparan broj, dodas jos jednog (fiktivnog) igraca da bude paran broj, izvrtis algoritam, i uzmes da tko god igra s tim fiktivnim igracem, u stvari pauzira tu rundu.
Pošto vidim da je tema još aktivna i ljudi je gledaju, pa ako kome zatreba, evo implementacije jednog round algoritma, što ga je Tracer spomenuo te davne 2011.
Vremenska složenost je O(N^2), točnije (n-1) x n, a prostorna O(N).
Za neparne brojeve vrijedi pravilo iz gornjeg posta.
#include <iostream>
using namespace std;
int main()
{
int n = 10, temp, temp1;
int igraci[100];
for (int i = 0; i < n / 2; i++)
{
igraci[i] = i+1;
igraci[n - i - 1] = n / 2 + i + 1;
}
for (int j = 0; j < n-1; j++)
{
cout << j + 1 << " Kolo:" << endl;
cout << endl;
for (int k = 0; k < n / 2; k++)
{
cout << igraci[k] << " : " << igraci[k + n / 2] << endl;
}
cout << endl;
temp = igraci[n / 2];
temp1 = igraci[n/2-1];
for (int l = n/2-1; l >0; l--)
{
igraci[l] = igraci[l-1];
igraci[n - l-1] = igraci[n - l];
}
igraci[1] = temp;
igraci[n - 1] = temp1;
}
return 0;
}