Skoczek szachowy

0

Przerobiłam ten programik z pascala ale wyskakuje mi cały czas bład nie wiem co jest źle moze mi ktoś pomóc, o to kod programu :
with Ada.Text_Io;
use Ada.Text_Io;
with Ada.Integer_Text_Io;
use Ada.Integer_Text_Io;

procedure Skoczek is
Nmax : constant Integer := 20;
I,
J : Integer;
N : Integer;
Pocz1,
Pocz2 : Integer;
Ok : Boolean;
Ruchy : array (Integer range 1 .. 8, Integer range 1 .. 2) of Integer;
Szach : array (1 .. Nmax, 1 .. Nmax) of Integer;

procedure Ruch (
I,
Wsp1,
Wsp2 : Integer;
Ok : out Boolean ) is
Wspnast1,
Wspnast2,
Nr : Integer;
Okwewn : Boolean;

begin
Nr:=0;
loop
Nr:=Nr+1;
Okwewn:=False;
Put(Wspnast1);
Put(" ");
Put(Wspnast2);
Put(" ");

     Wspnast1:=Wspnast1 + Ruchy(Nr,1);
     Wspnast2:=Wspnast2 + Ruchy(Nr,2);
     if (Wspnast1 in 1..N) and (Wspnast2 in 1..N) then
        if Szach(Wspnast1,Wspnast2)=0 then
           Szach(Wspnast1,Wspnast2):=I;
           if I<N*N then
              Ruch(I+1, Wspnast1,Wspnast2,Okwewn);
              if not Okwewn then
                 Szach(Wspnast1,Wspnast2):=0;
              end if;
           else
              Okwewn:=True;
           end if;
           exit when Okwewn or (Nr=8);
           Ok:=Okwewn;
        end if;
     end if;
  end loop;

end Ruch;

begin
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;
Put("Podaj rozmiar szachownicy");
Get(N);
Put("Podaj punkty poczatkowa pierwsza ");
Get(Pocz1);
Put("Podaj wspolrzedne poczatkowa druga");
Get(Pocz2);
if not (N in 1..Nmax) or not (Pocz1 in 1..N) or not (Pocz2 in 1..N) then
Put("blad danych");
end if;
for I in 1..N loop
for J in 1..N loop
Szach(I,J):=0;
Szach(Pocz1,Pocz2):=1;
Ruch(2,Pocz1,Pocz2,Ok);
end loop;
end loop;
if Ok then
for I in 1..N loop
for J in 1..N loop
Put(Szach(I,J));
end loop;
end loop;
else
Put("brak rozwiazania");
end if;

end Skoczek;

0

Porpawione troche i teraz zawsze wyskakuje mi brak rozwiązania

with Ada.Text_Io;
use Ada.Text_Io;
with Ada.Integer_Text_Io;
use Ada.Integer_Text_Io;

procedure Skoczek is
Nmax : constant Integer := 20;
I,
J : Integer;
N : Integer;
Pocz1,
Pocz2 : Integer;
Ok : Boolean;
Ruchy : array (Integer range 1 .. 8, Integer range 1 .. 2) of Integer;
Szach : array (1 .. Nmax, 1 .. Nmax) of Integer;

procedure Ruch (
I,
Wsp1,
Wsp2 : Integer;
Ok : out Boolean ) is
Wspnast1,
Wspnast2,
Nr : Integer;
Okwewn : Boolean;

begin
Nr:=0;
loop
Nr:=Nr+1;
Okwewn:=False;
Put(Wspnast1);
- Wspnast1:=Wspnast1 + Ruchy(Nr,1);
Wspnast2:=Wspnast2 + Ruchy(Nr,2);
if (Wspnast1 in 1..N) and (Wspnast2 in 1..N) then
if Szach(Wspnast1,Wspnast2)=0 then
Szach(Wspnast1,Wspnast2):=I;
if I<N*N then
Ruch(I+1, Wspnast1,Wspnast2,Okwewn);
if not Okwewn then
Szach(Wspnast1,Wspnast2):=0;
end if;
else
Okwewn:=True;
end if;
end if;
end if;
if Okwewn or (Nr=8) then
Ok:=Okwewn;
exit;
end if;

  end loop;

end Ruch;

begin
Put("Podaj rozmiar szachownicy");
Get(N);
Put("Podaj punkty poczatkowa pierwsza ");
Get(Pocz1);
Put("Podaj wspolrzedne poczatkowa druga");
Get(Pocz2);
if not (N in 1..Nmax) or not (Pocz1 in 1..N) or not (Pocz2 in 1..N) then
Put("blad danych");
end if;
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;

for I in 1..N loop
for J in 1..N loop
Szach(I,J):=0;
Szach(Pocz1,Pocz2):=1;
Ruch(2,Pocz1,Pocz2,Ok);
end loop;
end loop;
if Ok then
for I in 1..N loop
for J in 1..N loop
Put(Szach(I,J));
end loop;
end loop;
else
Put("brak rozwiazania");
end if;

end Skoczek;

0

Dwa błędy w algorytmie.


```delphi
Wspnast1 := Wsp1 + Ruchy(Nr,1);
Wspnast2 := Wsp2 + Ruchy(Nr,2);
zamiast
Wspnast1 := Wspnast1 + Ruchy(Nr,1);
Wspnast2 := Wspnast2 + Ruchy(Nr,2);

oraz

for I in 1..N loop
   for J  in 1..N loop
      Szach(I,J):=0;
   end loop;
end loop;
Szach(Pocz1,Pocz2):=1;
Ruch(2,Pocz1,Pocz2,Ok);
zamiast
for I in 1..N loop
   for J  in 1..N loop
      Szach(I,J):=0;
      Szach(Pocz1,Pocz2):=1;
      Ruch(2,Pocz1,Pocz2,Ok);
   end loop;
end loop;
a swoją drogą zamiast tego loopa można dać po prostu
`<code class="delphi">Szach := ( others => ( others => 0 ) );</code>`



0

Poradziłaś sobie z tym czy pomóc Ci napisać? Bo hmm... tamten kod jakoś tak dziwnie działa...

0

Nie dzięki teraz, działa już dobrze przynajmniej mi. A może ma ktoś pomysł na zrobienie tego iteracyjnie <lol>

0

A potrzebujesz to pilnie na jutro? Jak na czwartek lub później to mogę napisać, ale dziś już nie mam nawet tyle czasu.

0

Nie mysle ze to wystarczy jestem ciekawa po prostu jak wygladała by metoda iteracyjna.

0

Uf, na razie napisałem rekurencyjnie: http://paste.phpfi.com/40499. Mam nadzieję, że jest dość czytelne. Przykład działania:

[tuuresairon@localhost tuuresairon]$ ./skoczek

Podaj rozmiar szachownicy:  8

Podaj pierwsza wspolrzedna: 1

Podaj druga wspolrzedna:    1

      |     1    2    3    4    5    6    7    8
----- + ---------------------------------------------
    1 |     1   38   55   34    3   36   19   22
    2 |    54   47    2   37   20   23    4   17
    3 |    39   56   33   46   35   18   21   10
    4 |    48   53   40   57   24   11   16    5
    5 |    59   32   45   52   41   26    9   12
    6 |    44   49   58   25   62   15    6   27
    7 |    31   60   51   42   29    8   13   64
    8 |    50   43   30   61   14   63   28    7

[tuuresairon@localhost tuuresairon]$

Jak jutro znajdę chwilę czasu to napiszę też iteracyjnie ;)

edit:
Poprawiłem obsługę błędów, dlatego zamieniłem linka.

0

http://paste.phpfi.com/40560 - proszę, wszystko ładnie poprawiłem i dodałem wersję iteracyjną (iteratywną? :P) funkcji Move. Okazało się, że nie była ani trochę trudniejsza do napisania niż rekurencyjna :)
Zaspokoiłem ciekawość?

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