Wyciąganie kolejnych malejących wartości z tablicy

0

Witam
Podjąłem się implementacji algorytmu gry kółko i krzyżyk ze strony: http://cc-team.org/index.php?name=artykuly&show=103

Próbuję zabezpieczyć algorytm przed wstawianiem O lub X w to samo miejsce.
Problem jest dość błahy dla bardziej zaawansowanych jednak ja mam z tym problem
Otóż mam tablicę stan[8] na podstawie której program podejmuje decyzje na jakim polu wykonać ruch. Największa wartość tablicy oznacza że ruch jest najbardziej odpowiedni. Jednak gdy pole jest już zajęte chciałbym aby komputer wybrał wartość największą ale dla wolnego pola, nie mogę posortować tablicy, bo indeks tablicy stan[8] jest jednocześnie adresem pola.
Jak zrobić to w najbardziej optymalny sposób?

0

Przy zaledwie 8-miu elementach zwykłe wyszukiwanie liniowe będzie optymalne.

0

Liniowo wyszukałem największą wartość z tablicy, nie wiem natomiast jak przejść do kolejnych coraz mniejszych wartości.

 
if(stan[k]>maks)
{
	maks=stan[k];
	i_maks=k;
}
	
0

Zrób kopię zapasową tej tablicy. Użyj najlepiej tej funkcji: http://www.cplusplus.com/reference/algorithm/max_element/ i jak ona zwróci największy element to po prostu usuń go z tej tablicy zapasowej. Powtarzaj te kroki dopóki będa elementy w tablicy.

0

Może prościej:

bool first=true;
int best=0;
for(int i=0;i<StanCount;++i)
  {
   if(((first)||(Stan[best]<Stan[i]))&&(!BylRuch(i)))
     {
      best=i;
      first=false;
     }
  }
if(first) // nie znaleziono
else // best - najlepszy ruch
0

Napisałem coś takiego, działa dobrze do pewnego momentu albo przy posortowanej tablicy.

int k=8;
	int a= * max_element( kopia, kopia + 8 );
	while(k>=0)
	{
   for(int i=0; i<8; i++)
   {
	   if(kopia[i]== a) kopia[i]=0;
	  
		a = * max_element( kopia, kopia + 8 );
   }
   cout<<"a po zerowaniu: "<<a<<endl;
   cout<<"najwieksza wartosc: "<< * max_element( kopia, kopia + 8 ) << '\n';
   
   k--;
	}
0
for (int k = 0; k < 8; k++) {
    int pos = max_element(kopia, kopia + 8) - kopia;
    cout << "najwieksza wartosc: " << kopia[pos] << " na pozycji: " << pos << '\n';
    kopia[pos] = std::numeric_limits<int>::min(); // lub coś innego ekstremalnie małego
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1