Konik szachowy.
Ostatnio zmodyfikowano 2015-11-18 19:47
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 #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 }; int pion[ 8 ] = { 2, - 1, 1, - 2, 2, 1, - 1, - 2 }; int obecny_poziom = 0; int obecny_pion = 0; szachownica[ 0 ][ 0 ] = 1; 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 ]; } } } 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; }
|
|
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 :) |
|
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 ?
|
|
« 1 » |