RWC i zabawki czyli odwrócone Wieże Hanoi
zwykłe i odwrócone wieże Hanoi zabawka dla dzieci od lat 5
wieże Hanoi idea:
Algorytm powinien losować: z której kolumny (drążka) pobrać krążek w którą kolumnę (na który drążek) włożyć krążek Przełożenie powinno być wykonane tylko wtedy, kiedy z bazy reguł wynika, że dany ruch jest możliwy
Baza reguł: możliwy jest tylko następujący ruch: na mniejszy krążek można położyć tylko większy krążek
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI SOP
tworzymy macierz aktualnego ruchu i zapisujemy ją ustawieniem początkowym położenie i szerokość krążka WCZYAJ USAWIEIA POCZĄKOWE SRUKURY m=[0 0 3; 0 0 2; 0 0 1];
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI SOP
wybór drążka, z którego zabieramy krążek wybór drążka, na który położymy krążek skad=fix((rand(1,1))*k0)+1; dokad=fix((rand(1,1))*k0)+1; LOSUJ SKĄD liczba kolumn LOSUJ DOKĄD
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? if skad~=dokad AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI SOP
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? [y,i]=max(m(:,skad)); if y>0 skąd PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI np. 0 0 0 0 0 2 0 3 1 SOP
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? np. 0 0 0 0 0 2 0 3 1 skąd WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH [y,i]=max(m(:,skad)); [...] [y1,i1]=max(m(:,dokad)); if y>y1 JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI SOP
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY np. skąd LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? 0 0 0 0 0 2 0 3 1 WYBRAY DRĄŻEK SKĄD PUSY? [y1,i1]=max(m(:,dokad)); if y>y1 AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? USUŃ IEPORZEBE KROKI if y1>0 m(i1-1,dokad)=m(i,skad); else m(w0,dokad)=m(i,skad); end m(i,skad)=0; i- pozycja max. wartości w kolumnie skąd SOP
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? SOP USUŃ IEPORZEBE KROKI ii=ii+1; mm(:,:,ii)=m;
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH JES POWÓRZEIE? CEL OSIĄGIĘY? SOP USUŃ IEPORZEBE KROKI sprawdź, czy ostatnia, wygenerowana sekwencja nie wraca do stanu z przeszłości s1 jeżeli tak, usuń wszystkie kroki począwszy od s1+1 aż do ostatniego stanu
mm(:,:,1) = 0 0 3 0 0 2 0 0 1 s1 mm(:,:,2) = 0 0 0 0 0 2 3 0 1 s1+1 mm(:,:,3) = 0 0 3 0 0 2 0 0 1 s1+2 (ostatni)
for ss=ii-1:-1:1 if mm(:,:,ss)==mm(:,:,ii) ii=ss; mm=mm(:,:,1:ss); break end end
SAR WCZYAJ USAWIEIA POCZĄKOWE SRUKURY LOSUJ SKĄD LOSUJ DOKĄD SKĄD!=DOKĄD? WYBRAY DRĄŻEK SKĄD PUSY? np. m(1,1) AJWIĘKSZY K. DOKĄD MIEJSZY OD K. SKĄD? PRZEIEŚ KRĄŻEK ZAPISZ WYKOAY RUCH 0 0 0 0 0 2 0 3 1 JES POWÓRZEIE? CEL OSIĄGIĘY? SOP USUŃ IEPORZEBE KROKI while m(1,1)~=w0
m=[0 0 3; 0 0 2; 0 0 1]; mm=[]; [w0 k0]=size(m); for ss=ii-1:-1:1 if mm(:,:,ss)==mm(:,:,ii) ii=ss; mm=mm(:,:,1:ss); break end end ii=1; mm(:,:,ii)=m; end mm while m(1,1)~=w0 skad=fix((rand(1,1))*k0)+1; dokad=fix((rand(1,1))*k0)+1; if skad~=dokad [y,i]=max(m(:,skad)); if y>0 [y1,i1]=max(m(:,dokad)); if y>y1 if y1>0 m(i1-1,dokad)=m(i,skad); else m(w0,dokad)=m(i,skad); end m(i,skad)=0; ii=ii+1; mm(:,:,ii)=m; end end end
uruchamiamy program reah2.m