const MaxN = 200; type Bytost = (Trpaslik, Hobit, VolnaZidle); var A : array [1..MaxN*2+1] of Bytost; { Tady budeme mit ulozeno pocatecni rozesazeni } N : integer; { Pocet hobitu = pocet trpasliku } Volna, { Pozice volne stolicky } PoslTrpaslik, { Pozice odkud hledame dalsiho } { spatne sediciho trpaslika } PrvniHobit : integer; { -"- hobita } procedure Vstup; { Tato procedura nacte vstyp } var i,p:integer; begin write('Zadej N:'); read(N); writeln('Zadavej postupne tprasliky - 1, hobity - 2, nebo volno - 0'); for i:=1 to 2*N+1 do { Postupne nacteme obsazenost zidli } begin read(p); if p=1 then A[i]:=Trpaslik else if p=2 then A[i]:=Hobit else A[i]:=VolnaZidle; end; end; procedure Pocitej; { Tato procedura spocita zpusob presazovani a prubezne ho vypisuje } begin Volna:=1; { Nalezneme volnou zidli } while A[Volna]<>VolnaZidle do Volna:=Volna+1; PoslTrpaslik:= 2*N + 1; { Trpasliky hledame odzadu dopredu } { Take bychom mohli hledat od N+2. zidle } { smerem dozadu } PrvniHobit := 1; { Hobity hledame odpredu dozadu } { Dokud nedojdeme na hobita a trpaslika, ktery sedi spravne } while PrvniHobit < PoslTrpaslik do begin { Nalezneme dalsiho nezpracovaneho hobita } { uricte nejakeho najdeme, nebot v nejhorsim dojdeme } { na spravne sedici -> zadny jiz nesedi spatne } while A[PrvniHobit]<>Hobit do PrvniHobit:=PrvniHobit + 1; { Nalezneme dalsiho nezpracovaneho trpaslika } while A[PoslTrpaslik]<>Trpaslik do PoslTrpaslik:=PoslTrpaslik - 1; if Volna N+1 then { a jeste mame spatne sediciho } begin { Vypiseme vystup } writeln('Presadime trpaslika z ',PoslTrpaslik,'. zidle na ',Volna, '. zidli'); { Volnou se stane tam, kde sedel trpaslik } Volna:=PoslTrpaslik; { Dalsiho trpaslika hledame o jedno vlevo } PoslTrpaslik:=PoslTrpaslik - 1; { Pole A neni potreba nijak aktualizovat, protoze sem } { se uz nevratime a volna zidle je take O.K. - nevadi } end else { Pokud nemame spatne sediciho trpaslika nic nedelej - uz je srovnano } else { Volna je tedy v horni polovine a presadime hobita } if PrvniHobit < N+1 then { a jeste mame spatne sediciho } begin { Vypiseme vystup } writeln('Presadime hobita z ',PrvniHobit,'. zidle na ',Volna, '. zidli'); { Volnou se stane tam, kde sedel hobit } Volna:=PrvniHobit; { Dalsiho hobita hledame o jedno vlevo } PrvniHobit:=PrvniHobit + 1; { Pole A neni potreba nijak aktualizovat, protoze sem } { se uz nevratime a volna zidle je take O.K. - nevadi } end; end; writeln('Konec presouvani'); end; begin { Hlavni program } Vstup; Pocitej; end.