Mali zadatak u C++

poruka: 19
|
čitano: 5.825
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
12 godina
neaktivan
offline
Mali zadatak u C++

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.

 
0 0 hvala 0
13 godina
neaktivan
offline
Mali zadatak u C++

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.

Poruka je uređivana zadnji put pon 15.8.2011 23:44 (Budimir).
 
0 0 hvala 0
12 godina
neaktivan
offline
Mali zadatak u C++

Mislim da je rješenje Round Robin algoritam. Potraži na netu kako se implementira.

Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Mali zadatak u C++

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.

Poruka je uređivana zadnji put uto 16.8.2011 20:03 (Budimir).
 
1 0 hvala 1
12 godina
neaktivan
offline
Mali zadatak u C++

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).

Poruka je uređivana zadnji put uto 16.8.2011 19:02 (TracerCPP).
Moj PC  
0 0 hvala 0
13 godina
neaktivan
offline
Mali zadatak u C++

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.

Poruka je uređivana zadnji put uto 16.8.2011 20:03 (Budimir).
 
0 0 hvala 0
12 godina
neaktivan
offline
Re: Mali zadatak u C++

Č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.

Poruka je uređivana zadnji put uto 16.8.2011 20:24 (TracerCPP).
13 godina
neaktivan
offline
Mali zadatak u C++

Ok, sry ...

 
1 0 hvala 0
15 godina
offline
Re: Mali zadatak u C++
Stena.Blek kaže...

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.....

14 godina
neaktivan
offline
Mali zadatak u C++

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 ;)

*_helper_* msn: dinkecc@windowslive.com
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Mali zadatak u C++

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).

So then I typed GOTO 500 - and here I am!
Poruka je uređivana zadnji put sri 17.8.2011 1:00 (rustweaver).
14 godina
neaktivan
offline
Mali zadatak u C++

Aha, ali visual c++ ima i kompajler i sve što mi treba.

*_helper_* msn: dinkecc@windowslive.com
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Re: Mali zadatak u C++

Sve ima, ne moras se zamarati tim tehnikalijama jos, bit ce vremena kasnije i za to...

Samo si skini VS i pocni uciti.

So then I typed GOTO 500 - and here I am!
12 godina
neaktivan
offline
Mali zadatak u C++

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

 

 

 
0 0 hvala 0
12 godina
neaktivan
offline
Mali zadatak u C++

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.

Poruka je uređivana zadnji put pet 19.8.2011 16:37 (TracerCPP).
Moj PC  
3 0 hvala 0
13 godina
neaktivan
offline
Mali zadatak u C++

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 ...

 
0 0 hvala 0
12 godina
neaktivan
offline
Re: Mali zadatak u C++

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

 

11 godina
offline
Re: Mali zadatak u C++

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.

16 godina
neaktivan
offline
Mali zadatak u C++

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;

 

Poruka je uređivana zadnji put pon 16.11.2015 22:54 (Floki).
 
2 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice