konik szachowy - problem z implementacja z pascala na C

0

witam, problem jest pewnie dla doswiadczonych programistow calkiem prosty do rozwiazania. Mianowicie mam algorytm do wyznaczania drogi konika szachowego, ale napisany w pascalu. Problem tkwi w tym ze musze go miec w C, probowalem robic to sam, ale niestety widac jeszcze mam spore problemy ze skladnia C bo nie dziala. wklejam zroblo pascalowe oraz moja "przerobke". Jesli to mozliwe prosilbym o poprawienie bledow/napisanie algorytmu, jesli nie byloby to zbyt duzym problemem.

program Skoczek;
{ Program znajdowania drogi skoczka na uogólnionej
szachownicy }
const
nmax = 20; { maksymalny rozmiar szachownicy }
var
i,j, { zmienne pomocnicze }
n, { rozmiar szachownicy }
pocz1,pocz2: { początkowe ustawienie skoczka }
integer;
ok: boolean; { zmienna kontrolna }
ruchy: array[1..8,1..2] of integer; { różnice
współrzędnych }
szach: array[1..nmax,1..nmax] of integer; {szachownica}

 procedure Ruch(i,wsp1,wsp2: integer; var ok: boolean);
 { Rekurencyjna procedura wyznaczania następnego ruchu }
 { i - numer ruchu,
   wsp1,wsp2 - aktualne współrzędne skoczka,
   ok - zmienna kontrolna } 
 var
    okwewn: boolean;
    nr,   { kolejny ruch spośród ośmiu możliwych ruchów }
    wspnast1, wspnast2: { współrzędne następnego ruchu }
      integer;
 begin 
    nr := 0;            { przygotowanie wyboru ruchów }
    repeat
      nr := nr + 1;    { wybranie następnego ruchu spośród
                         ośmiu możliwych ruchów }
      okwewn := false; { ustawienie wartości zmiennej
                         kontrolnej }
      { ustalenie współrzędnych następnego ruchu }
      wspnast1 := wsp1 + ruchy[nr,1];
      wspnast2 := wsp2 + ruchy[nr,2];
      if (wspnast1 in [1..n]) and (wspnast2 in [1..n])
      then
         if szach[wspnast1,wspnast2] = 0 then       { ruch
                                            dopuszczalny }
            begin
              { zaznaczenie ustawienia następnego ruchu }
              szach[wspnast1,wspnast2] := i;
              if i < n * n then  { jeśli są wolne pola }
                 begin
                    { rekurencyjne wywołanie procedury
                      dla następnego ruchu }
                    Ruch(i+1,wspnast1,wspnast2,okwewn);
                    if  not okwewn then
                    { usunięcie zaznaczenia ruchu }
                      szach[wspnast1,wspnast2] := 0
                 end
              else
                 okwewn := true
            end
 
    until okwewn or (nr = 8);  { aż ruch został wykonany 
    poprawnie lub nie ma więcej możliwych ruchów }
    ok := okwewn    { wyprowadzenie na zewnątrz wartości
                      kontrolnej }
 end;
 
 begin
    writeln('Podaj rozmiar szachownicy');
    readln(n);
    writeln('Podaj punkty początkowe');
    readln(pocz1,pocz2);
    if ( not (n in [1..nmax])) or ( not (pocz1 in [1..n]))
      or ( not (pocz2 in [1..n])) then
      begin
         writeln('Błąd danych');
         halt
      end;
    { wyznaczenie różnic współrzędnych }
    ruchy[1,1] := -2;   ruchy[1,2] :=  1;
    ruchy[2,1] := -1;   ruchy[2,2] :=  2;
    ruchy[3,1] :=  1;   ruchy[3,2] :=  2;
    ruchy[4,1] :=  2;   ruchy[4,2] :=  1;
    ruchy[5,1] :=  2;   ruchy[5,2] := -1;
    ruchy[6,1] :=  1;   ruchy[6,2] := -2;
    ruchy[7,1] := -1;   ruchy[7,2] := -2;
    ruchy[8,1] := -2;   ruchy[8,2] := -1;
    { przygotowanie tablicy }
    for i := 1 to n do
      for j := 1 to n do
         szach[i,j] := 0;
    szach[pocz1,pocz2] := 1;
    Ruch(2,pocz1,pocz2,ok);    { wyznaczanie ruchów }
    if ok then
      { wydruk rozwiązania }
      for i := 1 to n do
         begin
            for j := 1 to n do
              write(szach[i,j]:4);
            writeln
         end
    else
      writeln('Brak rozwiązania')
 end.

teraz moja "przerobka" :)

#include <stdio.h>
#include <conio.h>
#define nmax =8;

int i,j;/max rozmiar szachownicy/
int n; /rozmiar szachownicy/
int x_pocz,y_pocz; /poczatkowe ustawienie skoczka/
bool ok; /zmienna kontrolna/

int ruchy[7][7];/roznice wspolrzednych/
int szach[7][7];

int Ruch(int n, int i,int x_wsp,int y_wsp, bool ok){
/* procedura wyznaczania nastepnego ruchu
i-numer ruchu, x_wsp,y-wsp - aktualne wspolrzedne
ok zmienna kontrolna*/

bool okwewn;
int nr,x_wspnas,y_wspnas;
nr=0; /*przygotowanie wyboru ruchow*/
 do
 {	
	
	okwewn==false; /*ustawienie zmiennej kontrolnej*/
	
	/*ustalenie wsporzednych nastepnego ruchu*/
	y_wspnas=y_wsp+ruchy[nr][1];
	x_wspnas=x_wsp+ruchy[nr][2];
	nr=nr++;/*wybranie nastepnego ruchu*/
	puts(".");
	if((x_wspnas>=0 && x_wspnas<=7)&&(y_wspnas>=0 && y_wspnas<=7))
		{
		 if (szach[x_wspnas][y_wspnas] == 0) /*ruch dopuszczalny*/
			{
			 szach[x_wspnas][y_wspnas]=1;
			 if(i<n*n) /*jesli sa wolne pola*/
				{puts("a");
				 /*rekurencyjne wywolanie dla nastepnego ruchu*/
				 Ruch(n,i+1,x_wspnas,y_wspnas,okwewn);
				 if(okwewn)
					{
					 /*usuniecie zaznaczenia ruchu*/
					 
					 szach[x_wspnas][y_wspnas]=0;
                     puts("hej");
                     getch();
                     }
					 }
				 }
				 else {okwewn;}
			 }
		 }
 while((not okwewn) || (nr!=7));/*az ruch niepoprawny albo ma mozliwosc ruchu*/
 ok=okwewn; /*wyprowadzenie na zewnatrz*/
 }

main(){

n=8;
puts("podaj punkty poczatkowe");
scanf("%d", &x_pocz);
scanf("%d", &y_pocz);
puts("COS COS COS");
ruchy[0][1]=-2;
ruchy[1][1]=-1;
ruchy[2][1]=1;
ruchy[3][1]=2;
ruchy[4][1]=2;
ruchy[5][1]=1;
ruchy[6][1]=-1;
ruchy[7][1]=-2;

ruchy[0][2]=1;
ruchy[1][2]=2;
ruchy[2][2]=2;
ruchy[3][2]=1;
ruchy[4][2]=-1;
ruchy[5][2]=-2;
ruchy[6][2]=-2;
ruchy[7][2]=-1;
j=0;
i=0;
for(i=0;i<8;i++)
{ puts(".");
for(j=0;j<8;j++)
{puts("-");
szach[i][j]=0;
}
}
szach[x_pocz][y_pocz]=1;
Ruch(n,2,x_pocz,y_pocz,ok);
i=0;
if(ok)
{
for(i=0;i<8;i++)
{
printf("%d", szach[i][j]);

	 }
 }

else{puts("brak rozwiazania");}
getch();

0

wczesniej myslalem ze algorytm moze chodzi ale nie mam dostatecznie duzo cierpliwosci zeby poczekac na wynik, jednak sprawdzilemw prrosty sposob puts("hej") czy algorytm czysci zle ruchy..i niestety tak sie nie dzieje wiec?

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