Jako że dzięki mojemu ostatniemu postowi :
Jak poprawić mój kod? nauczyłem się jak korzystać z wektorów to zachęcony tą pomocą znów zwracam się z prośbą do osób bardziej ogarniętych w temacie.
Mianowicie chce nauczyć się rekurencji i algorytmów z powrotami. Czytam Wirtha i doszedłem do problemu drogi skoczka szachowego.
Próbowałem to zaklepać samodzielnie jednak nie potrafie sobie poradzić z powrotami.
Oto kod (mniej ważne pierdoły na górze, część gdzie powinny być powroty zaraz nad mainem):
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void wypelnij(int ** tab,int N)
{
for(int i = 0; i<N; i++)
{
for(int k = 0; k<N; k++)
{
tab[i][k] = 0;
}
}
}
void wypisz(int ** tab,int N)
{
for(int i = 0; i<N; i++)
{
for(int k = 0; k<N; k++)
{
cout<<tab[i][k]<<" ";
}
cout<<endl;
}
}
bool poprawnosc_ruchu(int x,int y,int N,int ** szachownica) // WIADOMO - NIE MOZEMY WYJSC POZA TABLICE ANI ODWIEDZIC MIEJSCA JUZ ODWIEDZONEGO
{
if(x>=0 && x<N && y < N && y>0 && szachownica[x][y]==0) return true;
else return false;
}
bool ruch_mozliwy(int &wspx,int &wspy,int wariant_ruchu,int N,int ** szachownica)
{
switch(wariant_ruchu)
{
case 1 :
if (poprawnosc_ruchu(wspx+2,wspy+1,N,szachownica))
{
wspx = wspx + 2;
wspy = wspy + 1;
break;
}
case 2 :
if (poprawnosc_ruchu(wspx-2,wspy-1,N,szachownica) )
{
wspx = wspx - 2;
wspy = wspy - 1;
break;
}
case 3 :
if (poprawnosc_ruchu(wspx+2,wspy-1,N,szachownica) )
{
wspx = wspx + 2;
wspy = wspy - 1;
break;
}
case 4 :
if (poprawnosc_ruchu(wspx-2,wspy+1,N,szachownica) )
{
wspx = wspx - 2;
wspy = wspy + 1;
break;
}
case 5 :
if (poprawnosc_ruchu(wspx+1,wspy+2,N,szachownica) )
{
wspx = wspx + 1;
wspy = wspy + 2;
break;
}
case 6 :
if (poprawnosc_ruchu(wspx-1,wspy-2,N,szachownica) )
{
wspx = wspx - 1;
wspy = wspy - 2;
break;
}
case 7 :
if (poprawnosc_ruchu(wspx+1,wspy-2,N,szachownica) )
{
wspx = wspx + 1;
wspy = wspy - 2;
break;
}
case 8 :
if (poprawnosc_ruchu(wspx-1,wspy+2,N,szachownica) )
{
wspx = wspx - 1;
wspy = wspy + 2;
break;
}
default :
return false;
}
return true;
}
void konik(int ** szachownica,int wspx,int wspy,int nr_ruchu,int N)
{
if(nr_ruchu == N*N - 1)
{
wypisz(szachownica,N);
return;
}
szachownica[wspx][wspy] = nr_ruchu;
for(int i = 1; i<=8; i++)
{
if(ruch_mozliwy(wspx,wspy,i,N,szachownica))
{
nr_ruchu++;
szachownica[wspx][wspy] = nr_ruchu;
konik(szachownica,wspx,wspy,nr_ruchu,N);
}
// Tutaj powinien nastapic powrot, czyli jak skoczek nie ma się gdzie już ruszyć to aby próbował z miejsca wczesniej - jednak nie wiem jak to zrobić
}
return;
}
int main()
{
srand(time(NULL));
cout<<"Jak duza ma byc szachownica ? "<<endl;
int N;
cin>>N;
int **szachownica = new int * [N];
for(int i = 0; i<N; i++)
{
szachownica[i] = new int [N];
}
wypelnij(szachownica,N);
konik(szachownica,0,0,1,N);
wypisz(szachownica,N);
return 0;
}
Prośba do osób którym chce się pomóc :
-
Czy mógłby ktoś w przystępny sposób wytłumaczyć mi jak użyć tutaj tego powrotu , tak aby konik się nie ścinał gdy znajdzie się w ślepym zaułku tylko się cofnął?
-
Czy mógłby ktoś polecić jakieś źródło gdzie w sposób prosty i przystępny jest wytłumaczona rekurencja? ( nie chcę gotowców ani banalnych przykładów z silnią- wiem że jest ich pełno).