Skocz do zawartości
puszek

[pascal] Hanoi

Rekomendowane odpowiedzi

Mam zadanko z pascala rozwiązac wieze hanoi rekurencyjnie i przedstawic sposób działania w trybie graficznym.

 

 

Kod:

program Wieze_Hanoi;

uses graph;

var

karta,tryb,n,ilK,ypocz,gr,j:integer;

t :array[1..3,1..12] of integer;

tw:array[1..3] of integer;

 

procedure przeloz_krazek(skad, dokad : integer);

begin

tw[dokad]:=tw[dokad]+1;

t[dokad,tw[dokad]]:=t[skad,tw[skad]];

setFillStyle(1,black);

setColor(black);

bar(skad*200*110-100,ypocz-tw[skad]*gr,t[skad,tw[skad]]*j,gr);

t[skad,tw[skad]]:=0; tw[skad]:=tw[skad]-1;

setFillStyle(1,t[dokad,tw[dokad]]);

bar(dokad*110-100,ypocz-tw[dokad]*gr,t[dokad,tw[dokad]]*j,gr);

readLn;

end;

procedure przeloz(ile, skad, dokad, roboczy : integer);

begin

if ile=1 then przeloz_krazek(skad, dokad)

else

begin

przeloz(ile-1, skad, roboczy, dokad);

przeloz_krazek(skad, dokad);

przeloz(ile-1, roboczy, dokad, skad)

end;

end;

 

begin

writeln('podaj ilosc krazkow');

readln(ilk);

detectgraph(karta,tryb);

initgraph(karta, tryb,'');

writeln('Nacisnij dowolny klawisz');

gr:=30;

j:=19-ilK;

ypocz:=430;

for n:=1 to ilK do

t[1,n]:=ilK-n+1;

tw[1]:=ilK;

for n:=1 to tw[1] do

begin

setfillstyle(1,t[1,n]);

bar((1*110-100)+10*n,ypocz-(n*gr),(1*180)-10*n,ypocz-(n*gr)-gr);

end;

readLn;

przeloz(ilK,1,3,2);

closeGraph;

end.

 

 

 

Mam tyle. Program rysuje prostokaty ale ma problem z rysowaniem ich po kazdym następnym ruchu nie wiem jak temu zaradzić i proszę o pomoc.

Z góry dzieki

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

jak to robisz ze wklejasz kod tutaj na forum?

da sie go jakos skopiowac z kompilatora i wkleic tutaj?

1429297[/snapback]

Poprostu otwieram paskalowski plik (nazwa.pas) w notatniku i kopiuje (ctrl+c ) i wklejam to tutaj do postu. :lol: Proste prawda.

Edytowane przez puszek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Odkopuje temat :P Dostałem takie zadanko na laborkach. Znalazłem w sieci gotowy algorytm, ale go za bardzo nie rozumiem. Poza tym przedstawia on tylko kolejnosc wykonywanych ruchów, a ja chce zeby pokazywal stan stosu przed i po kazdym ruchu. Nie wiem czy powinienem robić to na tablicach, czy jakos inaczej... To co przed chwilą napisalem macie tutaj:

 

program zadanie5;{$APPTYPE CONSOLE}uses  SysUtils;type stos = array[1..100] of byte;var  nA,nB,nC,i,n:integer;  A,B,C:stos;function hanoi(nA,nB,nC,n:integer):integer;begin// chcialem tu zastosowac rekurencje, ale jeszcze nie wykombinowalem jakie jej zadac warunki...end;begin  randomize;  writeln('Podaj N:');  readln(n);  for i:=1 to n do  A[i]:=i;  writeln('   A   B   C');  writeln('===============');  for i:=1 to n do  writeln(A[i]:4,B[i]:4,C[i]:4);  hanoi(1,0,0,n);  readln;end.

A to co znalazlem w sieci tutaj:

 

program Z6;{$APPTYPE CONSOLE}uses  SysUtils;var  t:array [1..5] of char;  i:byte;procedure Hanoi(A, B, C:char; n:byte);begin  If n<>0 Then  begin	Hanoi(A, C, B, n-1);	write(t[n],'=>');	t[n]:=C;	writeln(t[n]);	Hanoi(B, A, C, n-1)  end;End;begin  for i:=1 to 5 do t[i]:='A';  Hanoi('A','B','C',5);  readln;end.

Jakieś sugestie ? Teraz zabieram się za stos, bo nie znam tego typu, a wlasnie z nim mi sie problem wiezy hanoi kojarzy. Nie moge też zrozumieć czemu w programach jakie znajduje w sieci jest tylko jedna tablica i trzy zmienne, a nie 3 tablice, albo chociaz jedna 3-wymiarowa...

 

UPDATE!

No więc tak... Napisalem już działający program ale dalej go do końca nie rozumiem. Poprostu działa on wg. założen "zabawy" w Hanoi... Wyjasni mi to ktos wreszcie ? Moze chociaz odesle do odpowiedniej literatury ?

 

program Project2;{$APPTYPE CONSOLE}uses  SysUtils;var   n,ilK,j:integer;	  t :array[1..3,1..12] of integer;	  tw:array[1..3] of integer;procedure rysuj(n:integer);var i:integer;begin  writeln('   A   B   C');  writeln('===============');  for i:=n downto 1 do  writeln(t[1,i]:4,t[2,i]:4,t[3,i]:4);end;procedure przeloz_krazek(skad, dokad : integer);var i:integer;begin  tw[dokad]:=tw[dokad]+1; t[dokad,tw[dokad]]:=t[skad,tw[skad]];  t[skad,tw[skad]]:=0; tw[skad]:=tw[skad]-1;   rysuj(ilK);  readLn;end;procedure przeloz(ile, skad, dokad, roboczy : integer);begin  if ile=1 then przeloz_krazek(skad, dokad)  else begin		 przeloz(ile-1, skad, roboczy, dokad);		 przeloz_krazek(skad, dokad);		 przeloz(ile-1, roboczy, dokad, skad)	   end;end;begin  writeLn('Wciskaj enter i obserwuj co sie dzieje...');  ilK:=5; j:=19-ilK; j:=19-ilK;  for n:=1 to ilK do t[1,n]:=ilK-n+1;  tw[1]:=ilK;  rysuj(ilK);  przeloz(ilK,1,3,2);end.
Edytowane przez nightstalker

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...