const N = 8; var OhrozenyRadek: array[ 1..N ] of boolean; OhrozenaUhloprickaSoucet: array[ 1+1..N+N ] of boolean; OhrozenaUhloprickaRozdil: array[ 1-N..N-1 ] of boolean; KdeJeTaDama: array[ 1..N ] of integer; pocet: integer; procedure VytiskniVysledek; var x,y: integer; begin pocet := pocet+1; writeln( pocet,':' ); for y:=1 to N do begin for x:=1 to N do if y = KdeJeTaDama[ x ] then write( ' D' ) else write( ' .' ); writeln end; readln end; procedure UmistiDamu( x: integer ); var y: integer; begin if x > N then VytiskniVysledek else for y := 1 to N do if not OhrozenyRadek[ y ] then if not OhrozenaUhloprickaSoucet[ x+y ] then if not OhrozenaUhloprickaRozdil[ x-y ] then begin OhrozenyRadek[ y ] := TRUE; OhrozenaUhloprickaSoucet[ x+y ] := TRUE; OhrozenaUhloprickaRozdil[ x-y ] := TRUE; KdeJeTaDama[ x ] := y; UmistiDamu( x+1 ); OhrozenaUhloprickaRozdil[ x-y ] := FALSE; OhrozenaUhloprickaSoucet[ x+y ] := FALSE; OhrozenyRadek[ y ] := FALSE end end; begin UmistiDamu( 1 ) end. var pristi: char; function Clen: integer; forward; function Faktor: integer; forward; function Vyraz: integer; var V: integer; zn: char; begin V := Clen; while pristi in ['+','-'] do begin if pristi = '+' then begin read( pristi ); V := V + Clen end else begin read( pristi ); V := V - Clen end end; Vyraz := V end; function Clen: integer; var C: integer; zn: char; begin C := Faktor; while pristi in ['*','/'] do begin if pristi = '*' then begin read( pristi ); C := C * Faktor end else begin read( pristi ); C := C div Faktor end end; Clen := C end; function Faktor: integer; var x: integer; begin if pristi = '(' then begin read( pristi ); Faktor := Vyraz; read( pristi ) { to by mela byt ')' } end else begin x := 0; while pristi in ['0'..'9'] do begin x := 10*x + ord(pristi) - ord('0'); read( pristi ) end; Faktor := x end end; begin read( pristi ); writeln( Vyraz ) end. function Hodnota: integer; var zn: char; x: integer; begin read( zn ); if zn = '+' then Hodnota := Hodnota + Hodnota else if zn = '-' then Hodnota := Hodnota - Hodnota else if zn = '*' then Hodnota := Hodnota * Hodnota else if zn = '/' then Hodnota := Hodnota div Hodnota else begin x := 0; while zn in ['0'..'9'] do begin x := 10*x + ord(zn) - ord('0'); read( zn ) end; Hodnota := x end end; begin writeln( Hodnota ) { cisla ukoncena mezerou } end. type PVyraz = ^TVyraz; TVyraz = record operace: char; hodnota: integer; L,P: PVyraz end; function Vyraz( operace: char; hodnota: integer; L,P: PVyraz ): PVyraz; var n: PVyraz; begin new( n ); n^.operace := operace; n^.hodnota := hodnota; n^.L := L; n^.P := P; Vyraz := n end; var x: integer; function Hodnota( v: PVyraz ): integer; begin { if v^.operace = '=' then Hodnota := v^.hodnota else if v^.operace = 'x' then Hodnota := x else if v^.operace = '+' then Hodnota := Hodnota( v^.L ) + Hodnota( v^.P ) else if v^.operace = '-' then Hodnota := Hodnota( v^.L ) - Hodnota( v^.P ) else if v^.operace = '*' then Hodnota := Hodnota( v^.L ) * Hodnota( v^.P ) else if v^.operace = '/' then Hodnota := Hodnota( v^.L ) div Hodnota( v^.P ); {} case v^.operace of '=': Hodnota := v^.hodnota; 'x': Hodnota := x; '+': Hodnota := Hodnota( v^.L ) + Hodnota( v^.P ); '-': Hodnota := Hodnota( v^.L ) - Hodnota( v^.P ); '*': Hodnota := Hodnota( v^.L ) * Hodnota( v^.P ); '/': Hodnota := Hodnota( v^.L ) div Hodnota( v^.P ); end end; procedure Vytiskni; begin end; var v: PVyraz; begin v := Vyraz( '+', 0, Vyraz( '=', 15, NIL, NIL ), Vyraz( '*', 0, Vyraz( '=', 3, NIL, NIL ), Vyraz( 'x', 4, NIL, NIL ))); writeln( Hodnota( v ) ); v := Vyraz( '+', 0, Vyraz( '*', 0, Vyraz( 'x', 0, NIL, NIL ), Vyraz( 'x', 0, NIL, NIL ) ), Vyraz( '=', 7, NIL, NIL )); for x:=1 to 20 do writeln( x:5,': ', Hodnota( v ) ) end.