function JeProhravajici( a,b,c,d: integer): boolean; var i: integer; begin if (a+b+c+d = 0) then JeProhravajici := TRUE else begin for i:=1 to a do if JeProhravajici(a-i,b,c,d) then begin JeProhravajici := FALSE; exit end; for i:=1 to b do if JeProhravajici(a,b-i,c,d) then begin JeProhravajici := FALSE; exit end; for i:=1 to c do if JeProhravajici(a,b,c-i,d) then begin JeProhravajici := FALSE; exit end; for i:=1 to d do if JeProhravajici(a,b,c,d-i) then begin JeProhravajici := FALSE; exit end; JeProhravajici := TRUE end end; begin writeln( JeProhravajici( 7,5,3,1 ) ); writeln( JeProhravajici( 7,5,2,1 ) ); writeln( JeProhravajici( 7,5,3,0 ) ); end. const PRAZDNE = 0; N = 5; var S: array[1..N,1..N] of integer; var kolikratBylaVolanaFunkce: longint; procedure Vytiskni; var i,j: integer; begin for i:=1 to N do begin for j:=1 to N do write( S[i,j]: 3 ); writeln end; writeln( 'kolikratBylaVolanaFunkce: ', kolikratBylaVolanaFunkce ); readln end; type TPokracovani = array[0..8] of record x,y: integer; PocetSousedu: integer end; function PocetSousedu( x,y: integer ): integer; var dx,dy, xx,yy: integer; pocet: integer; begin pocet := 0; for dx := -2 to +2 do for dy := -2 to +2 do if abs(dx)+abs(dy)=3 then begin xx := x + dx; yy := y + dy; if (xx>=1) and (xx<=N) and (yy>=1) and (yy<=N) then if S[xx,yy] = PRAZDNE then Inc( pocet ) end; PocetSousedu := pocet end; procedure ZapisHodnotuAPokracuj( k, x,y: integer ); var dx,dy, xx,yy: integer; Pokracovani: TPokracovani; xPokracovani, i,j: integer; begin Inc( kolikratBylaVolanaFunkce ); S[x,y] := k; if k = N*N then Vytiskni else begin xPokracovani := 0; for dx := -2 to +2 do for dy := -2 to +2 do if (abs(dx)+abs(dy)=3) then begin xx := x+dx; yy := y+dy; if (xx>=1) and (xx<=N) and (yy>=1) and (yy<=N) then if S[xx,yy] = PRAZDNE then begin Inc( xPokracovani ); Pokracovani[ xPokracovani ].x := xx; Pokracovani[ xPokracovani ].y := yy; Pokracovani[ xPokracovani ].PocetSousedu := PocetSousedu( xx,yy ) end end; { setridit Pokracovani: } for i:=1 to xPokracovani-1 do for j:=1 to xPokracovani-1 do if Pokracovani[ i ].PocetSousedu > Pokracovani[ i+1 ].PocetSousedu then begin Pokracovani[0] := Pokracovani[i]; Pokracovani[i] := Pokracovani[i+1]; Pokracovani[i+1] := Pokracovani[0] end; {} { prozkoumat pokracovani: } for i:=1 to xPokracovani do ZapisHodnotuAPokracuj( k+1, Pokracovani[i].x, Pokracovani[i].y ); end; S[x,y] := PRAZDNE end; var i,j: integer; begin for i:=1 to N do for j:=1 to N do S[i,j] := PRAZDNE; kolikratBylaVolanaFunkce := 0; ZapisHodnotuAPokracuj( 1, 1,1 ); writeln( 'kolikratBylaVolanaFunkce: ', kolikratBylaVolanaFunkce ) end. const PRAZDNE = 0; N = 8; var S: array[1..N,1..N] of integer; procedure Vytiskni; var i,j: integer; begin for i:=1 to N do begin for j:=1 to N do write( S[i,j]: 3 ); writeln end; readln end; procedure ZapisHodnotuAPokracuj( k, x,y: integer ); var dx,dy, xx,yy: integer; begin S[x,y] := k; if k = N*N then Vytiskni else for dx := -2 to +2 do for dy := -2 to +2 do if (abs(dx)+abs(dy)=3) then begin xx := x+dx; yy := y+dy; if (xx>=1) and (xx<=N) and (yy>=1) and (yy<=N) then if S[xx,yy] = PRAZDNE then ZapisHodnotuAPokracuj( k+1, xx, yy ) end; S[x,y] := PRAZDNE end; var i,j: integer; begin for i:=1 to N do for j:=1 to N do S[i,j] := PRAZDNE; ZapisHodnotuAPokracuj( 1, 1,1 ) end. const N = 8; A: array[1..N] of integer = (7, 13, 5, 3, 1, 2, 18, 10 ); function OKolikMuzeVyhratHracKteryJeNaTahu( zac, kon: integer ): integer; var zleva, zprava: integer; begin if zac > kon then begin OKolikMuzeVyhratHracKteryJeNaTahu := 0; exit end; zleva := A[zac] - OKolikMuzeVyhratHracKteryJeNaTahu( zac+1, kon ); zprava := A[kon] - OKolikMuzeVyhratHracKteryJeNaTahu( zac, kon-1 ); if zleva > zprava then OKolikMuzeVyhratHracKteryJeNaTahu := zleva else OKolikMuzeVyhratHracKteryJeNaTahu := zprava end; begin writeln( OKolikMuzeVyhratHracKteryJeNaTahu(1,8) ) end. const N = 8; A: array[1..N] of integer = (7, 13, 5, 3, 1, 2, 18, 10 ); function max( a,b: integer): integer; begin if a >= b then max := a else max := b end; function min( a,b: integer ): integer; begin if a <= b then min := a else min := b end; function OKolikMuzeVyhratPrvniHrac( jeNaTahuPrvni: boolean; zac, kon, prvni, druhy: integer ): integer; begin if zac > kon then OKolikMuzeVyhratPrvniHrac := prvni - druhy else if jeNaTahuPrvni then OKolikMuzeVyhratPrvniHrac := max( OKolikMuzeVyhratPrvniHrac( not jeNaTahuPrvni, zac+1, kon, prvni+A[zac], druhy ), OKolikMuzeVyhratPrvniHrac( not jeNaTahuPrvni, zac, kon-1, prvni+A[kon], druhy ) ) else OKolikMuzeVyhratPrvniHrac := min( OKolikMuzeVyhratPrvniHrac( not jeNaTahuPrvni, zac+1, kon, prvni, druhy+A[zac] ), OKolikMuzeVyhratPrvniHrac( not jeNaTahuPrvni, zac, kon-1, prvni, druhy+A[kon] ) ) end; begin writeln( OKolikMuzeVyhratPrvniHrac(TRUE, 1,8, 0,0 ) ) end. function JeProhravajici( N: integer ): boolean; var i: integer; begin if N=0 then JeProhravajici := TRUE else begin if (N>=1) and JeProhravajici( N-1 ) then begin JeProhravajici := FALSE; exit end; if (N>=2) and JeProhravajici( N-2 ) then begin JeProhravajici := FALSE; exit end; if (N>=6) and JeProhravajici( N-6 ) then begin JeProhravajici := FALSE; exit end; JeProhravajici := TRUE end end; var i: integer; begin for i:=0 to 20 do writeln( i:3,': ', JeProhravajici( i ) ) end. function JeProhravajici( N: integer ): boolean; var i: integer; begin if N=0 then JeProhravajici := TRUE else begin for i:=1 to 3 do if (N>=i) and JeProhravajici( N-i ) then begin JeProhravajici := FALSE; exit end; JeProhravajici := TRUE end end; var i: integer; begin for i:=0 to 24 do writeln( i:3,': ', JeProhravajici( i ) ) end.