Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Konik szachowy.

Ostatnio zmodyfikowano 2015-11-18 19:47
Autor Wiadomość
arccostn
Temat założony przez niniejszego użytkownika
Konik szachowy.
» 2015-11-15 11:28:21
Dzień dobry. Potrzebuję programu o z popularnym problemem konia szachowego. Ma odwiedzić każde pole szachownicy tylko raz. Napisałem coś takiego, problem jest z tym, że robiąc po kolei  możliwe ruchy ręcznie wyszło mi coś innego niż wyświetla program. Drugim problemem jest napisanie warunku gdy skoczek nie może się ruszyć. Nie wiem, czy ogólny zamysł tego co zrobiłem jest dobry.

http://i.imgur.com/UVSWtGc.jpg?1

C/C++
#include <iostream>

using namespace std;

int main()
{
    const int n = 8;
   
    int szachownica[ n ][ n ] = { };
   
   
    int poziom[ 8 ] = { 1, 2, 2, 1, - 1, - 2, - 2, - 1 }; // 8 mozliwych ruchow skoczka
    int pion[ 8 ] = { 2, - 1, 1, - 2, 2, 1, - 1, - 2 };
   
    int obecny_poziom = 0; //pozycja startu
    int obecny_pion = 0;
   
    szachownica[ 0 ][ 0 ] = 1; // odwiedzona
   
    int nr_ruchu = 1;
   
   
    for( int j = 0; j <= n * n; j++ )
    {
        for( int i = 0; i < 8; i++ )
        {
            obecny_poziom += poziom[ i ];
            obecny_pion += pion[ i ];
           
            if(( obecny_pion >= 0 ) &&( obecny_pion < n ) &&( obecny_poziom >= 0 ) &&( obecny_poziom < n ) &&
            ( szachownica[ obecny_pion ][ obecny_poziom ] == 0 ) )
            {
                szachownica[ obecny_pion ][ obecny_poziom ] = 1;
                nr_ruchu++;
               
            }
            else
            {
                obecny_pion = obecny_pion - pion[ i ];
                obecny_poziom = obecny_poziom - poziom[ i ];
               
            }
        }
        // Musze jeszcze powrotnego if zrobic
       
    }
   
   
    if( nr_ruchu = 2 )
    {
        szachownica[ 8 ][ 8 ];
        for( int i = 0; i < n; i++ )
        {
            for( int j = 0; j < n; j++ )
                 cout << szachownica[ i ][ j ] << " ";
           
            cout << endl;
        }
    }
   
   
   
   
   
    return 0;
   
   
}
P-140148
Agares
» 2015-11-15 22:33:02
Co do drugiego problemu, to pomyślałbym o obiektowym przedstawieniu szachownicy i wtedy bez problemowo można by dodać parametr typu bool. Który odpowiadałby za ustawianie pola z nieodwiedzonego na odwiedzone. I przed wykonaniem ruchu sprawdzić jakie status mają pola na które są w zasięgu ruchu skoczka. Jeśli dobrze zrozumiałem o co ci chodzi :)
P-140201
ArgonZapan
» 2015-11-18 19:47:47
miałem kiedyś konika szachowego ale mi zaginał... :(
Ale z pamięci mogę ci przybliżyć jak to zrobiłem
stworzyłem tablice int gdzie każda wartość miała -1
Następnie funkcja rekurencyjna gdzie było 8x "if"  - czyli wszystkie możliwe ruchy oraz który to już jego ruch np:


// i - który ruch
void rekurencja(int x, int y, int i){
 tab[x][y] = i
 i++;
 if(tab[x+2][y+1] != -1){
  rekurencta(x+2, y+1, i);
  tab[x+2][y+1] = -1;
 }
...
if(){}

}

no i jak nie miał żadnego ruchu to przeszedł po wszystkich if i powrót rekurencyjny do tyłu.
(Pamietaj że jak wraca to musi zacierać swoje ruchy, tzn tab[x+2][y+1] = -1, oraz licznik ruchów zmiejszyć o jeden.)
no i w którymś miejscu musisz sprawdzać czy i == 64, bo tyle jest pól na planszy.
jeśli się tak stanie to wypisujesz całą tablice i masz od razu ponumerowane miejsca w których się poruszał skoczek.
to tak pokrótce.

PS PWr WPPT ?
P-140345
« 1 »
  Strona 1 z 1