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();