Algorytm skoczka szachowego rekurencyjny w C++

Algorytm skoczka szachowego rekurencyjny w C++
Odpowiedź

Poniżej zamieszczam swój algorytm. Niestety ze względu na to, że jest to algorytm rekurencyjny na wynik trzeba czekać od kilkunastu do kilkudziesięciu minut. Nie mam możliwości odpalenia algorytmu na wydajniejszej maszynie, dlatego nie doczekałem się wyniku. Nie mam też 100% pewności, czy algorytm jest poprawny, ale możesz się przynajmniej na czymś wzorować. #include #include #include using namespace std; //struktura opisujaca pozycje skoczka struct Position { int x; int y; }; //zmienna przechowujaca pozycje startowa skoczka Position start; //rozmiar szachownicy const int r = 8; //funkcja sprawdza, czy kazde z pol zostalo 1 raz odwiedzone bool koniec (int** tab) { for(int i=0; i &trasa) { //sprawdzamy, czy nie wyszlismy poza plansze if(a<0 || a>=r || b<0 || b>=r) return false; //warunek zakonczenia obliczen if(a==start.x && b==start.y && koniec(tab)) return true; //sprawdzamy czy pole nie bylo juz odwiedzane if(tab[a][b]>0) return false; //zwiekszamy licznik odwiedzin tab[a][b]++; //dodanie aktualnej pozycji do trasy Position aktualna; aktualna.x = a; aktualna.y = b; trasa.push_back(aktualna); if( skoczek(a-1, b+2, tab, trasa) ) return true; if( skoczek(a+1, b+2, tab, trasa) ) return true; if( skoczek(a-1, b-2, tab, trasa) ) return true; if( skoczek(a+1, b+2, tab, trasa) ) return true; if( skoczek(a-2, b-1, tab, trasa) ) return true; if( skoczek(a-2, b+1, tab, trasa) ) return true; if( skoczek(a+2, b-1, tab, trasa) ) return true; if( skoczek(a+2, b+1, tab, trasa) ) return true; //usuniecie tych odwiedzin tab[a][b]--; //usuniecie tego ruchu z trasy trasa.pop_back(); return false; } int main(int argc, char *argv[]) { //pozycja startowa skoczka start.x = 4; start.y = 4; //tablica przechowująca liczbę odwiedzin danego pola int** tab = new int*[r]; for(int i=0; i trasa; if( skoczek(start.x,start.y,tab,trasa) ) { //wyswietlenie znalezionej trasy for(int i=0; i(trasa[i].x+65)<<" "; cout<

Dodaj swoją odpowiedź