Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (* Lab11 - skoczek szachowy *)
- program skoczek;
- uses crt;
- var tab : array[1..20] of array[1..20] of boolean; // true - był, false - nie był
- var moves : array[1..8] of array[1..2] of integer; //Możliwe ruchy konia szachowego
- var x, y : integer; // Pozycja skoczka
- var size : integer; // Rozmiar szachownicy
- var visited : integer; // Jeżeli wyniesie size^2, to znaczy, że wszyskie pola obskoczył.
- var i, j : integer;
- var calls : int64;
- function canMove(moveType : integer) : boolean;
- var res : boolean;
- begin
- res := true;
- if (x+moves[moveType, 1] > size) or (x+moves[moveType, 1] < 1) then // Wyjedzie z planszy w X
- begin
- res := false;
- end
- else if (y+moves[moveType, 2] > size) or (y+moves[moveType, 2] < 1) then // Wyjedzie z planszy w Y
- begin
- res := false;
- end
- else if(tab[x+moves[moveType, 1], y+moves[moveType, 2]] = true) then
- begin
- res := false;
- end;
- canMove := res;
- end;
- function tryMove(moveType : integer) : boolean;
- var finished : boolean;
- var k : integer;
- begin
- calls := calls+1;
- finished := false;
- // Rusz się
- x := x + moves[moveType, 1];
- y := y + moves[moveType, 2];
- visited := visited+1;
- tab[x, y] := true;
- if visited = size * size then //Obszedł wszystkie pola, jest OK.
- begin
- finished := true;
- end;
- clrscr;
- writeln('Pozycja: ', x, ', ', y);
- writeln('Odwiedzono pól: ', visited);
- writeln('Wywolan: ', calls);
- for i := 1 to size do
- begin
- for j := 1 to size do
- begin
- if tab[i, j] then
- begin
- write('X');
- end
- else
- begin
- write(' ');
- end;
- end;
- writeln();
- end;
- if finished then
- begin
- writeln('Zrobione.');
- end;
- readln;
- // Spróbuj iść dalej...
- if not finished then //...oczywiście jeżeli trzeba.
- begin
- for k:=1 to 8 do
- begin
- if canMove(k) then // Jeżeli może się gdzieś ruszyć
- begin
- if tryMove(k) then
- begin
- finished := true;
- end;
- end;
- end;
- end;
- // Wróć
- if not finished then
- begin
- tab[x, y] := false;
- visited := visited-1;
- x := x - moves[moveType, 1];
- y := y - moves[moveType, 2];
- clrscr;
- writeln('Pozycja: ', x, ', ', y);
- writeln('Odwiedzono pól: ', visited);
- writeln('Wywolan: ', calls);
- for i := 1 to size do
- begin
- for j := 1 to size do
- begin
- if tab[i, j] then
- begin
- write('X');
- end
- else
- begin
- write(' ');
- end;
- end;
- writeln();
- end;
- readln;
- end;
- tryMove := finished;
- end;
- begin
- calls := 0;
- // Ustawienie typów ruchów
- moves[1, 1] := 1;
- moves[1, 2] := 2;
- moves[2, 1] := 2;
- moves[2, 2] := 1;
- moves[3, 1] := 2;
- moves[3, 2] := -1;
- moves[4, 1] := 1;
- moves[4, 2] := -2;
- moves[5, 1] := -1;
- moves[5, 2] := -2;
- moves[6, 1] := -2;
- moves[6, 2] := -1;
- moves[7, 1] := -2;
- moves[7, 2] := 1;
- moves[8, 1] := -1;
- moves[8, 2] := 2;
- repeat
- begin
- write('Podaj rozmiar szachownicy: ');
- readln(size);
- end
- until (size >= 4) and (size <= 20);
- // Inicjalizacja szachownicy
- for i := 1 to size do
- begin
- for j := 1 to size do
- begin
- tab[i, j] := false;
- end;
- end;
- repeat
- begin
- write('Podaj x skoczka: ');
- readln(x);
- end
- until (x >= 1) and (x <= size);
- repeat
- begin
- write('Podaj y skoczka: ');
- readln(y);
- end
- until (y >= 1) and (y <= size);
- visited := 1; // Odwiedził pole, z którego startuje
- tab[x, y] := true;
- // Zacznij próbować ruchy
- for i:=1 to 8 do
- begin
- if canMove(i) then // Jeżeli może się gdzieś ruszyć
- begin
- if tryMove(i) then
- begin
- break; // Jak skończył, przerwij pętlę.
- end;
- end;
- end;
- writeln('Obskoczyl! ', calls);
- end.
- (*Typy ruchów:
- 8 1
- 7 2
- X
- 6 3
- 5 4
- *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement