Code (pascal):
{$M 65520,0,200000}
type xydpri=record xp: 1..21; yp: 1..21; dpp: 1..200; dpd: 1..200;end;
xydprimem = ^xydpri;
type xytok=record xt: 1..21; yt: 1..21; ciji: char; end;
xytokmem= ^xytok;
Datk= FILE OF xytok;
var
E: Text; F: Datk; fajl, prot: string[12]; x, xlo, y, ylo, br, brp: integer;
xy, kar: string[2]; tok:array[1..440] of xytokmem; isto: Boolean;
lgk:array[1..440,1..8] of string[10];
dpri:array[1..3520] of xydprimem;
procedure pocni;
begin
Randomize; x:=(Random(7))+7; y:=(Random(7))+7;
tok[1]^.xt:=x; tok[1]^.yt:=y; tok[1]^.ciji:='m';
reset(F); seek(F, filesize(F)); Write(F, tok[1]^);
Rewrite(E); Write(E, y, ' ', x);
close(E); Halt(1);
end;
procedure stubr(var sub: integer);
begin if Length(kar)>1 then
begin sub:=(Ord(kar[1])-48)*10; sub:=sub+(Ord(kar[2])-48); end
else sub:=(Ord(kar[1])-48); end;
procedure klinija;
begin fajl:=ParamStr(1); if fajl='' then begin writeln;
writeln('MALISA [fajl1] [fajl2] [br1] [br2] ');
writeln(' Takmicar za igru XOX na tabli 21 x 21.');
writeln(' Autor: Tomislav Karanovic');
halt(1); end;
Assign(E, fajl); fajl:=ParamStr(2);
Assign(F, fajl); {$I-} Reset(F); {$I+} if IOResult <> 0 then Rewrite(F);
kar:=ParamStr(3);
if kar='' then pocni else begin prot:=kar; stubr(y); kar:=ParamStr(4);
stubr(x); prot:=prot+' '+kar; end;
end;
procedure radi;
var brl, brd, brt, dpbr, pri, gde: integer; brk: 1..3; kk: char;
procedure jos;
var brjs: integer; jes: boolean;
procedure prior(pr1, pr2, pr3: integer);
begin
if (dpri[brjs]^.dpp=pr1)and(pri=pr2) then dpri[brjs]^.dpd:=pr3;
end;
begin jes:=true;
if (xlo>0)and(xlo<22)and(ylo>0)and(ylo<22) then
for brjs:=1 to brp do if (tok[brjs]^.xt=xlo)and(tok[brjs]^.yt=ylo)
then begin brjs:=brp; jes:=false; end;
for brjs:=1 to dpbr do if (dpri[brjs]^.xp=xlo)and(dpri[brjs]^.yp=ylo)
then begin
prior( 20, 20, 5); prior(20, 104, 6);
prior(104, 20, 6); prior(20, 105, 7);
prior(105, 20, 7); prior(20, 166, 8);
prior(166, 20, 8); prior(20, 100, 9);
prior(100, 20, 9); prior(20, 102, 10);
prior(102, 20, 10); prior(20, 168, 12);
prior(168, 20, 11); prior(20, 169, 12);
prior(169, 20, 12); prior(20, 170, 13);
prior(170, 20, 13); prior(20, 126, 14);
prior(126, 20, 14); prior(20, 127, 15);
prior(127, 20, 15); prior(20, 175, 16);
prior(175, 20, 16); prior(20, 190, 17);
prior(190, 20, 17); prior(20, 191, 18);
prior(191, 20, 18); prior(20, 192, 19);
prior(192, 20, 19);
prior(100, 100, 22);
prior(100, 104, 24); prior(104, 100, 24);
prior(100, 105, 25); prior(105, 100, 25);
prior(100, 166, 26); prior(166, 100, 26);
prior(100, 102, 27); prior(102, 100, 27);
prior(100, 168, 28); prior(168, 100, 28);
prior(100, 169, 29); prior(169, 100, 29);
prior(100, 170, 30); prior(170, 100, 30);
prior(100, 126, 31); prior(126, 100, 31);
prior(100, 127, 32); prior(127, 100, 32);
prior(100, 175, 33); prior(175, 100, 33);
prior(100, 190, 34); prior(190, 100, 34);
prior(100, 191, 35); prior(191, 100, 35);
prior(100, 192, 36); prior(192, 100, 36);
prior(100, 196, 37); prior(196, 100, 37);
prior(102, 102, 41); prior(102, 126, 42);
prior(126, 102, 42); prior(102, 127, 43);
prior(127, 102, 43); prior(102, 175, 44);
prior(175, 102, 44); prior(102, 190, 45);
prior(190, 102, 45); prior(102, 191, 46);
prior(191, 102, 46); prior(102, 192, 47);
prior(192, 102, 47); prior(102, 104, 48);
prior(104, 102, 48); prior(102, 105, 49);
prior(105, 102, 49); prior(102, 166, 50);
prior(166, 102, 50); prior(102, 168, 51);
prior(168, 102, 51); prior(102, 169, 52);
prior(169, 102, 52); prior(102, 170, 53);
prior(170, 102, 53); prior(196, 102, 54);
prior(102, 196, 54);
prior(104, 104, 56);
prior(104, 105, 57); prior(105, 104, 57);
prior(104, 166, 58); prior(166, 104, 58);
prior(104, 168, 59); prior(168, 104, 59);
prior(104, 169, 60); prior(169, 104, 60);
prior(104, 170, 61); prior(170, 104, 61);
prior(104, 126, 62); prior(126, 104, 62);
prior(104, 127, 63); prior(127, 104, 63);
prior(104, 175, 64); prior(175, 104, 64);
prior(104, 190, 65); prior(190, 104, 65);
prior(104, 191, 66); prior(191, 104, 66);
prior(104, 192, 67); prior(192, 104, 67);
prior(104, 196, 68); prior(196, 104, 68);
prior(105, 105, 71); prior(105, 166, 72);
prior(166, 105, 72); prior(105, 168, 73);
prior(168, 105, 73); prior(105, 169, 74);
prior(169, 105, 74); prior(105, 170, 75);
prior(170, 105, 75); prior(105, 126, 76);
prior(126, 105, 76); prior(105, 127, 77);
prior(127, 105, 77);
prior(105, 196, 78); prior(196, 105, 78);
prior(126, 126, 106); prior(126, 127, 107);
prior(127, 126, 107); prior(126, 175, 108);
prior(175, 126, 108); prior(126, 190, 109);
prior(190, 126, 109); prior(126, 191, 110);
prior(191, 126, 110); prior(126, 192, 111);
prior(192, 126, 111); prior(126, 166, 112);
prior(166, 126, 112); prior(126, 168, 113);
prior(168, 126, 113); prior(126, 169, 114);
prior(169, 126, 114); prior(126, 170, 115);
prior(170, 126, 115); prior(196, 126, 116);
prior(126, 196, 116);
prior(127, 127, 116); prior(127, 175, 117);
prior(175, 127, 117); prior(127, 190, 118);
prior(190, 127, 118); prior(127, 191, 119);
prior(191, 127, 119); prior(127, 192, 120);
prior(192, 127, 120); prior(127, 166, 121);
prior(166, 127, 121); prior(127, 168, 122);
prior(168, 127, 122); prior(127, 169, 123);
prior(169, 127, 123); prior(127, 170, 124);
prior(170, 127, 124); prior(196, 127, 125);
prior(127, 196, 125);
prior(166, 166, 21);
prior(166, 168, 129); prior(168, 166, 129);
prior(166, 169, 130); prior(169, 166, 130);
prior(166, 170, 131); prior(170, 166, 131);
prior(166, 175, 132); prior(175, 166, 132);
prior(166, 190, 133); prior(190, 166, 133);
prior(166, 191, 134); prior(191, 166, 134);
prior(166, 192, 135); prior(192, 166, 135);
prior(166, 196, 136); prior(196, 166, 136);
prior(175, 175, 21); prior(175, 190, 138);
prior(190, 175, 138); prior(175, 191, 139);
prior(191, 175, 139); prior(175, 192, 140);
prior(192, 175, 140); prior(196, 175, 141);
prior(175, 196, 141);
prior(168, 168, 142);
prior(168, 170, 143); prior(170, 168, 143);
prior(168, 175, 144); prior(175, 168, 144);
prior(170, 170, 145); prior(169, 169, 146);
prior(169, 170, 147); prior(170, 169, 147);
prior(169, 175, 148); prior(175, 169, 148);
prior(168, 190, 151); prior(190, 168, 151);
prior(168, 191, 152); prior(191, 168, 152);
prior(168, 192, 153); prior(192, 168, 153);
prior(169, 190, 157); prior(190, 169, 157);
prior(169, 191, 158); prior(191, 169, 158);
prior(169, 192, 159); prior(192, 169, 159);
prior(170, 190, 160); prior(190, 170, 160);
prior(170, 191, 161); prior(191, 170, 161);
prior(170, 192, 162); prior(192, 170, 162);
prior(168, 196, 163); prior(196, 168, 163);
prior(169, 196, 164); prior(196, 169, 164);
prior(170, 196, 165); prior(196, 170, 165);
prior(190, 190, 172); prior(191, 191, 173);
prior(192, 192, 174); prior(190, 191, 178);
prior(191, 190, 178); prior(190, 192, 179);
prior(192, 190, 179); prior(191, 192, 180);
prior(192, 191, 180); prior(190, 196, 181);
prior(196, 190, 181); prior(191, 196, 182);
prior(196, 191, 182); prior(192, 196, 183);
prior(196, 192, 183);
prior(196, 196, 193); prior(196, 197, 194);
prior(197, 196, 195); prior(197, 197, 196);
end;
if jes then begin dpbr:=dpbr+1; dpri[dpbr]^.xp:=xlo; dpri[dpbr]^.yp:=ylo;
dpri[dpbr]^.dpp:=pri; dpri[dpbr]^.dpd:=200; end;
end;
procedure kase;
begin
case brt of
1: begin xlo:=tok[br]^.xt; ylo:=(tok[br]^.yt+gde); jos; end;
2: begin xlo:=(tok[br]^.xt+gde); ylo:=tok[br]^.yt; jos; end;
3: begin xlo:=tok[br]^.xt; ylo:=(tok[br]^.yt-gde); jos; end;
4: begin xlo:=(tok[br]^.xt-gde); ylo:=tok[br]^.yt; jos; end;
5: begin xlo:=(tok[br]^.xt+gde); ylo:=(tok[br]^.yt+gde); jos; end;
6: begin xlo:=(tok[br]^.xt+gde); ylo:=(tok[br]^.yt-gde); jos; end;
7: begin xlo:=(tok[br]^.xt-gde); ylo:=(tok[br]^.yt-gde); jos; end;
8: begin xlo:=(tok[br]^.xt-gde); ylo:=(tok[br]^.yt+gde); jos; end;
end;
end;
procedure skup(pris, gde1, gde2: integer);
begin
pri:=pris; gde:=gde1; kase;
if gde2>0 then begin pri:=pris; gde:=gde2; kase; end;
end;
procedure kasedva;
var kdx, kdy: integer;
begin kdx:=tok[br]^.xt; kdy:=tok[br]^.yt;
case brd of
1: begin if (kdy+4)>21 then lgk[br,brd][6]:='k';
if (kdy+3)>21 then lgk[br,brd][5]:='k';
if (kdy+2)>21 then lgk[br,brd][4]:='k';
if (kdy+1)>21 then lgk[br,brd][3]:='k';
if (kdy-1)<1 then lgk[br,brd][1]:='k'; end;
2: begin if (kdx+4)>21 then lgk[br,brd][6]:='k';
if (kdx+3)>21 then lgk[br,brd][5]:='k';
if (kdx+2)>21 then lgk[br,brd][4]:='k';
if (kdx+1)>21 then lgk[br,brd][3]:='k';
if (kdx-1)<1 then lgk[br,brd][1]:='k'; end;
3: begin if (kdy-4)<1 then lgk[br,brd][6]:='k';
if (kdy-3)<1 then lgk[br,brd][5]:='k';
if (kdy-2)<1 then lgk[br,brd][4]:='k';
if (kdy-1)<1 then lgk[br,brd][3]:='k';
if (kdy+1)>21 then lgk[br,brd][1]:='k'; end;
4: begin if (kdx-4)<1 then lgk[br,brd][6]:='k';
if (kdx-3)<1 then lgk[br,brd][5]:='k';
if (kdx-2)<1 then lgk[br,brd][4]:='k';
if (kdx-1)<1 then lgk[br,brd][3]:='k';
if (kdx+1)>21 then lgk[br,brd][1]:='k'; end;
5: begin
if ((kdx+4)>21)or((kdy+4)>21) then lgk[br,brd][6]:='k';
if ((kdx+3)>21)or((kdy+3)>21) then lgk[br,brd][5]:='k';
if ((kdx+2)>21)or((kdy+2)>21) then lgk[br,brd][4]:='k';
if ((kdx+1)>21)or((kdy+1)>21) then lgk[br,brd][3]:='k';
if ((kdx-1)<1)or((kdy-1)<1) then lgk[br,brd][1]:='k'; end;
6: begin
if ((kdx+4)>21)or((kdy-4)<1) then lgk[br,brd][6]:='k';
if ((kdx+3)>21)or((kdy-3)<1) then lgk[br,brd][5]:='k';
if ((kdx+2)>21)or((kdy-2)<1) then lgk[br,brd][4]:='k';
if ((kdx+1)>21)or((kdy-1)<1) then lgk[br,brd][3]:='k';
if ((kdx-1)<1)or((kdy+1)>21) then lgk[br,brd][1]:='k'; end;
7: begin
if ((kdx-4)<1)or((kdy-4)<1) then lgk[br,brd][6]:='k';
if ((kdx-3)<1)or((kdy-3)<1) then lgk[br,brd][5]:='k';
if ((kdx-2)<1)or((kdy-2)<1) then lgk[br,brd][4]:='k';
if ((kdx-1)<1)or((kdy-1)<1) then lgk[br,brd][3]:='k';
if ((kdx+1)>21)or((kdy+1)>21) then lgk[br,brd][1]:='k'; end;
8: begin
if ((kdx-4)<1)or((kdy+4)>21) then lgk[br,brd][6]:='k';
if ((kdx-3)<1)or((kdy+3)>21) then lgk[br,brd][5]:='k';
if ((kdx-2)<1)or((kdy+2)>21) then lgk[br,brd][4]:='k';
if ((kdx-1)<1)or((kdy+1)>21) then lgk[br,brd][3]:='k';
if ((kdx+1)>21)or((kdy-1)<1) then lgk[br,brd][1]:='k'; end;
end;
end;
begin reset(F);
brp:=0; fajl:=''; dpbr:=0; pri:=0;
if prot<>'' then begin
while not Eof(F) do begin brp:=brp+1; Read(F, tok[brp]^); end;
brp:=brp+1; tok[brp]^.xt:=x; tok[brp]^.yt:=y; tok[brp]^.ciji:='p';
reset(F); seek(F, filesize(F)); Write(F, tok[brp]^); end;
x:=0; y:=0;
for br:=1 to brp do begin
for brd:=1 to 8 do begin lgk[br,brd]:='nnnnnn'; kasedva;
lgk[br,brd][2]:=tok[br]^.ciji; end;
for brl:=1 to brp do begin
for brd:=1 to 6 do begin if brd=6 then brd:=-1;
if (tok[brl]^.xt=tok[br]^.xt)and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,1][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.yt=tok[br]^.yt)and(tok[brl]^.xt=(tok[br]^.xt+brd))
then lgk[br,2][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=tok[br]^.xt)and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,3][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.yt=tok[br]^.yt)and(tok[brl]^.xt=(tok[br]^.xt-brd))
then lgk[br,4][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt+brd))and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,5][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt+brd))and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,6][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt-brd))and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,7][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt-brd))and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,8][brd+2]:=tok[brl]^.ciji;
if brd=-1 then brd:=6;
end;
end;
end;
for br:=1 to brp do begin
for brt:=1 to 8 do begin
for brk:=1 to 3 do begin
case brk of 1:kk:='n'; 2:kk:='p'; 3:kk:='k'; end;
if (lgk[br,brt]=kk+'mmmmn') then skup(1,4,0);
if (lgk[br,brt]=kk+'mmmnm') then skup(1,3,0);
if (lgk[br,brt]=kk+'mmnmm') then skup(1,2,0);
if (lgk[br,brt]=kk+'mnmmm') then skup(1,1,0); end;
for brk:= 1 to 3 do begin
case brk of 1:kk:='m'; 2:kk:='k'; 3:kk:='n'; end;
if (lgk[br,brt]=kk+'ppppn') then skup(2,4,0);
if (lgk[br,brt]=kk+'pppnp') then skup(2,3,0);
if (lgk[br,brt]=kk+'ppnpp') then skup(2,2,0);
if (lgk[br,brt]=kk+'pnppp') then skup(2,1,0);
if (lgk[br,brt]='npnnn'+kk) then skup(198,1,-1);
if (lgk[br,brt]='mpnnn'+kk) then skup(199,1,0);
if (lgk[br,brt]='kpnnn'+kk) then skup(199,1,0); end;
if (lgk[br,brt]='nmmmnn') then skup(3,3,-1);
if (lgk[br,brt]='nmmmnp') then skup(3,3,-1);
if (lgk[br,brt]='nmmmnk') then skup(3,3,-1);
if (lgk[br,brt]='nmmnmn') then skup(3,2,-1);
if (lgk[br,brt]='nmnmmn') then skup(3,1,-1);
if (lgk[br,brt]='npppnn') then skup(20,3,-1);
if (lgk[br,brt]='nppnpn') then skup(20,2,-1);
if (lgk[br,brt]='npnppn') then skup(20,1,-1);
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]='npppn'+kk) then skup(20,3,-1);
if (lgk[br,brt]='nppnp'+kk) then skup(100,2,-1);
if (lgk[br,brt]='npnpp'+kk) then skup(100,1,-1); end;
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'pppnn') then skup(100,3,4);
if (lgk[br,brt]=kk+'ppnpn') then skup(100,2,4);
if (lgk[br,brt]=kk+'pnppn') then skup(100,1,4);
if (lgk[br,brt]=kk+'ppnnp') then skup(105,2,3);
if (lgk[br,brt]=kk+'pnpnp') then skup(105,1,3);
if (lgk[br,brt]=kk+'pnnpp') then skup(105,1,2); end;
for brk:= 1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mmmnn') then skup(102,3,4);
if (lgk[br,brt]=kk+'mmnmn') then skup(102,2,0);
if (lgk[br,brt]=kk+'mnmmn') then skup(102,1,0);
if (lgk[br,brt]='nmmnm'+kk) then skup(102,2,-1);
if (lgk[br,brt]='nmnmm'+kk) then skup(102,1,-1);
if (lgk[br,brt]=kk+'mmnnm') then skup(127,2,3);
if (lgk[br,brt]=kk+'mnmnm') then skup(127,1,3);
if (lgk[br,brt]=kk+'mnnmm') then skup(127,1,2); end;
if (lgk[br,brt]='nppnnp') then skup(104,2,3);
if (lgk[br,brt]='npnpnp') then skup(104,1,3);
if (lgk[br,brt]='npnnpp') then skup(104,1,2);
if (lgk[br,brt]='nmmnnm') then skup(126,2,3);
if (lgk[br,brt]='nmnmnm') then skup(126,1,3);
if (lgk[br,brt]='nmnnmm') then skup(126,1,2);
if (lgk[br,brt]='npnpnn') then skup(166,1,3);
if (lgk[br,brt]='nppnnn') then skup(166,2,3);
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'pnpnn') then skup(168,1,3);
if (lgk[br,brt]=kk+'ppnnn') then skup(168,2,3);
if (lgk[br,brt]='npnpn'+kk) then skup(168,1,3);
if (lgk[br,brt]='nppnn'+kk) then skup(168,2,3);
if (lgk[br,brt]=kk+'pnnpn') then skup(170,1,2);
if (lgk[br,brt]=kk+'pnnnp') then skup(170,1,2);
if (lgk[br,brt]='npnnp'+kk) then skup(170,1,2); end;
if (lgk[br,brt]='npnnpn') then skup(169,1,2);
if (lgk[br,brt]='npnnnp') then skup(169,1,2);
if (lgk[br,brt]='nmnmnn') then skup(175,1,3);
if (lgk[br,brt]='nmmnnn') then skup(175,2,3);
for brk:= 1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mnmnn') then skup(190,1,3);
if (lgk[br,brt]=kk+'mmnnn') then skup(190,2,3);
if (lgk[br,brt]='nmnmn'+kk) then skup(190,1,3);
if (lgk[br,brt]='nmmnn'+kk) then skup(190,2,3);
if (lgk[br,brt]=kk+'mnnmn') then skup(192,1,2);
if (lgk[br,brt]=kk+'mnnnm') then skup(192,1,2);
if (lgk[br,brt]='nmnnm'+kk) then skup(192,1,2); end;
if (lgk[br,brt]='nmnnmn') then skup(191,1,2);
if (lgk[br,brt]='nmnnnm') then skup(191,1,2);
if (lgk[br,brt]='nmnnnn') then skup(196,-1,1);
for brk:=1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mnnnn') then skup(197,1,0);
if (lgk[br,brt]='nmnnn'+kk) then skup(196,-1,1); end;
end;
end;
pri:=200;
for br:=1 to dpbr do begin
if (dpri[br]^.dpp=pri)or(brp=2) then begin Randomize; brt:=(Random(2))+1;
if brt=2 then brd:=br; end;
if dpri[br]^.dpp<pri then begin pri:=dpri[br]^.dpp; brd:=br; end;
if dpri[br]^.dpd<pri then begin pri:=dpri[br]^.dpd; brd:=br; end; end;
if pri<200 then begin x:=dpri[brd]^.xp; y:=dpri[brd]^.yp; end;
isto:=false; if (x=0)and(y=0) then isto:=true;
if not isto then for br:=1 to brp do
if (x=tok[br]^.xt)and(y=tok[br]^.yt) then isto:=true;
if isto then begin brd:=0; brt:=0;
repeat brd:=brd+1; repeat brt:=brt+1; isto:=false;
for br:=1 to brp do if (brd=tok[br]^.xt)and(brt=tok[br]^.yt) then isto:=true;
if (brt=21)and(isto) then brt:=0;
until (not isto)or(brt=0); until (not isto)or(brd>21); x:=brd; y:=brt; end;
brp:=brp+1; tok[brp]^.xt:=x; tok[brp]^.yt:=y; tok[brp]^.ciji:='m';
reset(F); seek(F, filesize(F)); Write(F, tok[brp]^);
Rewrite(E); Write(E, y, ' ', x); close(E);
end;
begin
for br:=1 to 440 do GetMem(tok[br], sizeof(xytok));
for br:=1 to 3520 do GetMem(dpri[br], sizeof(xydpri));
klinija; radi;
for br:=1 to 440 do FreeMem(tok[br], sizeof(xytok));
for br:=1 to 3520 do FreeMem(dpri[br], sizeof(xydpri));
end.
{$M 65520,0,200000}
type xydpri=record xp: 1..21; yp: 1..21; dpp: 1..200; dpd: 1..200;end;
xydprimem = ^xydpri;
type xytok=record xt: 1..21; yt: 1..21; ciji: char; end;
xytokmem= ^xytok;
Datk= FILE OF xytok;
var
E: Text; F: Datk; fajl, prot: string[12]; x, xlo, y, ylo, br, brp: integer;
xy, kar: string[2]; tok:array[1..440] of xytokmem; isto: Boolean;
lgk:array[1..440,1..8] of string[10];
dpri:array[1..3520] of xydprimem;
procedure pocni;
begin
Randomize; x:=(Random(7))+7; y:=(Random(7))+7;
tok[1]^.xt:=x; tok[1]^.yt:=y; tok[1]^.ciji:='m';
reset(F); seek(F, filesize(F)); Write(F, tok[1]^);
Rewrite(E); Write(E, y, ' ', x);
close(E); Halt(1);
end;
procedure stubr(var sub: integer);
begin if Length(kar)>1 then
begin sub:=(Ord(kar[1])-48)*10; sub:=sub+(Ord(kar[2])-48); end
else sub:=(Ord(kar[1])-48); end;
procedure klinija;
begin fajl:=ParamStr(1); if fajl='' then begin writeln;
writeln('MALISA [fajl1] [fajl2] [br1] [br2] ');
writeln(' Takmicar za igru XOX na tabli 21 x 21.');
writeln(' Autor: Tomislav Karanovic');
halt(1); end;
Assign(E, fajl); fajl:=ParamStr(2);
Assign(F, fajl); {$I-} Reset(F); {$I+} if IOResult <> 0 then Rewrite(F);
kar:=ParamStr(3);
if kar='' then pocni else begin prot:=kar; stubr(y); kar:=ParamStr(4);
stubr(x); prot:=prot+' '+kar; end;
end;
procedure radi;
var brl, brd, brt, dpbr, pri, gde: integer; brk: 1..3; kk: char;
procedure jos;
var brjs: integer; jes: boolean;
procedure prior(pr1, pr2, pr3: integer);
begin
if (dpri[brjs]^.dpp=pr1)and(pri=pr2) then dpri[brjs]^.dpd:=pr3;
end;
begin jes:=true;
if (xlo>0)and(xlo<22)and(ylo>0)and(ylo<22) then
for brjs:=1 to brp do if (tok[brjs]^.xt=xlo)and(tok[brjs]^.yt=ylo)
then begin brjs:=brp; jes:=false; end;
for brjs:=1 to dpbr do if (dpri[brjs]^.xp=xlo)and(dpri[brjs]^.yp=ylo)
then begin
prior( 20, 20, 5); prior(20, 104, 6);
prior(104, 20, 6); prior(20, 105, 7);
prior(105, 20, 7); prior(20, 166, 8);
prior(166, 20, 8); prior(20, 100, 9);
prior(100, 20, 9); prior(20, 102, 10);
prior(102, 20, 10); prior(20, 168, 12);
prior(168, 20, 11); prior(20, 169, 12);
prior(169, 20, 12); prior(20, 170, 13);
prior(170, 20, 13); prior(20, 126, 14);
prior(126, 20, 14); prior(20, 127, 15);
prior(127, 20, 15); prior(20, 175, 16);
prior(175, 20, 16); prior(20, 190, 17);
prior(190, 20, 17); prior(20, 191, 18);
prior(191, 20, 18); prior(20, 192, 19);
prior(192, 20, 19);
prior(100, 100, 22);
prior(100, 104, 24); prior(104, 100, 24);
prior(100, 105, 25); prior(105, 100, 25);
prior(100, 166, 26); prior(166, 100, 26);
prior(100, 102, 27); prior(102, 100, 27);
prior(100, 168, 28); prior(168, 100, 28);
prior(100, 169, 29); prior(169, 100, 29);
prior(100, 170, 30); prior(170, 100, 30);
prior(100, 126, 31); prior(126, 100, 31);
prior(100, 127, 32); prior(127, 100, 32);
prior(100, 175, 33); prior(175, 100, 33);
prior(100, 190, 34); prior(190, 100, 34);
prior(100, 191, 35); prior(191, 100, 35);
prior(100, 192, 36); prior(192, 100, 36);
prior(100, 196, 37); prior(196, 100, 37);
prior(102, 102, 41); prior(102, 126, 42);
prior(126, 102, 42); prior(102, 127, 43);
prior(127, 102, 43); prior(102, 175, 44);
prior(175, 102, 44); prior(102, 190, 45);
prior(190, 102, 45); prior(102, 191, 46);
prior(191, 102, 46); prior(102, 192, 47);
prior(192, 102, 47); prior(102, 104, 48);
prior(104, 102, 48); prior(102, 105, 49);
prior(105, 102, 49); prior(102, 166, 50);
prior(166, 102, 50); prior(102, 168, 51);
prior(168, 102, 51); prior(102, 169, 52);
prior(169, 102, 52); prior(102, 170, 53);
prior(170, 102, 53); prior(196, 102, 54);
prior(102, 196, 54);
prior(104, 104, 56);
prior(104, 105, 57); prior(105, 104, 57);
prior(104, 166, 58); prior(166, 104, 58);
prior(104, 168, 59); prior(168, 104, 59);
prior(104, 169, 60); prior(169, 104, 60);
prior(104, 170, 61); prior(170, 104, 61);
prior(104, 126, 62); prior(126, 104, 62);
prior(104, 127, 63); prior(127, 104, 63);
prior(104, 175, 64); prior(175, 104, 64);
prior(104, 190, 65); prior(190, 104, 65);
prior(104, 191, 66); prior(191, 104, 66);
prior(104, 192, 67); prior(192, 104, 67);
prior(104, 196, 68); prior(196, 104, 68);
prior(105, 105, 71); prior(105, 166, 72);
prior(166, 105, 72); prior(105, 168, 73);
prior(168, 105, 73); prior(105, 169, 74);
prior(169, 105, 74); prior(105, 170, 75);
prior(170, 105, 75); prior(105, 126, 76);
prior(126, 105, 76); prior(105, 127, 77);
prior(127, 105, 77);
prior(105, 196, 78); prior(196, 105, 78);
prior(126, 126, 106); prior(126, 127, 107);
prior(127, 126, 107); prior(126, 175, 108);
prior(175, 126, 108); prior(126, 190, 109);
prior(190, 126, 109); prior(126, 191, 110);
prior(191, 126, 110); prior(126, 192, 111);
prior(192, 126, 111); prior(126, 166, 112);
prior(166, 126, 112); prior(126, 168, 113);
prior(168, 126, 113); prior(126, 169, 114);
prior(169, 126, 114); prior(126, 170, 115);
prior(170, 126, 115); prior(196, 126, 116);
prior(126, 196, 116);
prior(127, 127, 116); prior(127, 175, 117);
prior(175, 127, 117); prior(127, 190, 118);
prior(190, 127, 118); prior(127, 191, 119);
prior(191, 127, 119); prior(127, 192, 120);
prior(192, 127, 120); prior(127, 166, 121);
prior(166, 127, 121); prior(127, 168, 122);
prior(168, 127, 122); prior(127, 169, 123);
prior(169, 127, 123); prior(127, 170, 124);
prior(170, 127, 124); prior(196, 127, 125);
prior(127, 196, 125);
prior(166, 166, 21);
prior(166, 168, 129); prior(168, 166, 129);
prior(166, 169, 130); prior(169, 166, 130);
prior(166, 170, 131); prior(170, 166, 131);
prior(166, 175, 132); prior(175, 166, 132);
prior(166, 190, 133); prior(190, 166, 133);
prior(166, 191, 134); prior(191, 166, 134);
prior(166, 192, 135); prior(192, 166, 135);
prior(166, 196, 136); prior(196, 166, 136);
prior(175, 175, 21); prior(175, 190, 138);
prior(190, 175, 138); prior(175, 191, 139);
prior(191, 175, 139); prior(175, 192, 140);
prior(192, 175, 140); prior(196, 175, 141);
prior(175, 196, 141);
prior(168, 168, 142);
prior(168, 170, 143); prior(170, 168, 143);
prior(168, 175, 144); prior(175, 168, 144);
prior(170, 170, 145); prior(169, 169, 146);
prior(169, 170, 147); prior(170, 169, 147);
prior(169, 175, 148); prior(175, 169, 148);
prior(168, 190, 151); prior(190, 168, 151);
prior(168, 191, 152); prior(191, 168, 152);
prior(168, 192, 153); prior(192, 168, 153);
prior(169, 190, 157); prior(190, 169, 157);
prior(169, 191, 158); prior(191, 169, 158);
prior(169, 192, 159); prior(192, 169, 159);
prior(170, 190, 160); prior(190, 170, 160);
prior(170, 191, 161); prior(191, 170, 161);
prior(170, 192, 162); prior(192, 170, 162);
prior(168, 196, 163); prior(196, 168, 163);
prior(169, 196, 164); prior(196, 169, 164);
prior(170, 196, 165); prior(196, 170, 165);
prior(190, 190, 172); prior(191, 191, 173);
prior(192, 192, 174); prior(190, 191, 178);
prior(191, 190, 178); prior(190, 192, 179);
prior(192, 190, 179); prior(191, 192, 180);
prior(192, 191, 180); prior(190, 196, 181);
prior(196, 190, 181); prior(191, 196, 182);
prior(196, 191, 182); prior(192, 196, 183);
prior(196, 192, 183);
prior(196, 196, 193); prior(196, 197, 194);
prior(197, 196, 195); prior(197, 197, 196);
end;
if jes then begin dpbr:=dpbr+1; dpri[dpbr]^.xp:=xlo; dpri[dpbr]^.yp:=ylo;
dpri[dpbr]^.dpp:=pri; dpri[dpbr]^.dpd:=200; end;
end;
procedure kase;
begin
case brt of
1: begin xlo:=tok[br]^.xt; ylo:=(tok[br]^.yt+gde); jos; end;
2: begin xlo:=(tok[br]^.xt+gde); ylo:=tok[br]^.yt; jos; end;
3: begin xlo:=tok[br]^.xt; ylo:=(tok[br]^.yt-gde); jos; end;
4: begin xlo:=(tok[br]^.xt-gde); ylo:=tok[br]^.yt; jos; end;
5: begin xlo:=(tok[br]^.xt+gde); ylo:=(tok[br]^.yt+gde); jos; end;
6: begin xlo:=(tok[br]^.xt+gde); ylo:=(tok[br]^.yt-gde); jos; end;
7: begin xlo:=(tok[br]^.xt-gde); ylo:=(tok[br]^.yt-gde); jos; end;
8: begin xlo:=(tok[br]^.xt-gde); ylo:=(tok[br]^.yt+gde); jos; end;
end;
end;
procedure skup(pris, gde1, gde2: integer);
begin
pri:=pris; gde:=gde1; kase;
if gde2>0 then begin pri:=pris; gde:=gde2; kase; end;
end;
procedure kasedva;
var kdx, kdy: integer;
begin kdx:=tok[br]^.xt; kdy:=tok[br]^.yt;
case brd of
1: begin if (kdy+4)>21 then lgk[br,brd][6]:='k';
if (kdy+3)>21 then lgk[br,brd][5]:='k';
if (kdy+2)>21 then lgk[br,brd][4]:='k';
if (kdy+1)>21 then lgk[br,brd][3]:='k';
if (kdy-1)<1 then lgk[br,brd][1]:='k'; end;
2: begin if (kdx+4)>21 then lgk[br,brd][6]:='k';
if (kdx+3)>21 then lgk[br,brd][5]:='k';
if (kdx+2)>21 then lgk[br,brd][4]:='k';
if (kdx+1)>21 then lgk[br,brd][3]:='k';
if (kdx-1)<1 then lgk[br,brd][1]:='k'; end;
3: begin if (kdy-4)<1 then lgk[br,brd][6]:='k';
if (kdy-3)<1 then lgk[br,brd][5]:='k';
if (kdy-2)<1 then lgk[br,brd][4]:='k';
if (kdy-1)<1 then lgk[br,brd][3]:='k';
if (kdy+1)>21 then lgk[br,brd][1]:='k'; end;
4: begin if (kdx-4)<1 then lgk[br,brd][6]:='k';
if (kdx-3)<1 then lgk[br,brd][5]:='k';
if (kdx-2)<1 then lgk[br,brd][4]:='k';
if (kdx-1)<1 then lgk[br,brd][3]:='k';
if (kdx+1)>21 then lgk[br,brd][1]:='k'; end;
5: begin
if ((kdx+4)>21)or((kdy+4)>21) then lgk[br,brd][6]:='k';
if ((kdx+3)>21)or((kdy+3)>21) then lgk[br,brd][5]:='k';
if ((kdx+2)>21)or((kdy+2)>21) then lgk[br,brd][4]:='k';
if ((kdx+1)>21)or((kdy+1)>21) then lgk[br,brd][3]:='k';
if ((kdx-1)<1)or((kdy-1)<1) then lgk[br,brd][1]:='k'; end;
6: begin
if ((kdx+4)>21)or((kdy-4)<1) then lgk[br,brd][6]:='k';
if ((kdx+3)>21)or((kdy-3)<1) then lgk[br,brd][5]:='k';
if ((kdx+2)>21)or((kdy-2)<1) then lgk[br,brd][4]:='k';
if ((kdx+1)>21)or((kdy-1)<1) then lgk[br,brd][3]:='k';
if ((kdx-1)<1)or((kdy+1)>21) then lgk[br,brd][1]:='k'; end;
7: begin
if ((kdx-4)<1)or((kdy-4)<1) then lgk[br,brd][6]:='k';
if ((kdx-3)<1)or((kdy-3)<1) then lgk[br,brd][5]:='k';
if ((kdx-2)<1)or((kdy-2)<1) then lgk[br,brd][4]:='k';
if ((kdx-1)<1)or((kdy-1)<1) then lgk[br,brd][3]:='k';
if ((kdx+1)>21)or((kdy+1)>21) then lgk[br,brd][1]:='k'; end;
8: begin
if ((kdx-4)<1)or((kdy+4)>21) then lgk[br,brd][6]:='k';
if ((kdx-3)<1)or((kdy+3)>21) then lgk[br,brd][5]:='k';
if ((kdx-2)<1)or((kdy+2)>21) then lgk[br,brd][4]:='k';
if ((kdx-1)<1)or((kdy+1)>21) then lgk[br,brd][3]:='k';
if ((kdx+1)>21)or((kdy-1)<1) then lgk[br,brd][1]:='k'; end;
end;
end;
begin reset(F);
brp:=0; fajl:=''; dpbr:=0; pri:=0;
if prot<>'' then begin
while not Eof(F) do begin brp:=brp+1; Read(F, tok[brp]^); end;
brp:=brp+1; tok[brp]^.xt:=x; tok[brp]^.yt:=y; tok[brp]^.ciji:='p';
reset(F); seek(F, filesize(F)); Write(F, tok[brp]^); end;
x:=0; y:=0;
for br:=1 to brp do begin
for brd:=1 to 8 do begin lgk[br,brd]:='nnnnnn'; kasedva;
lgk[br,brd][2]:=tok[br]^.ciji; end;
for brl:=1 to brp do begin
for brd:=1 to 6 do begin if brd=6 then brd:=-1;
if (tok[brl]^.xt=tok[br]^.xt)and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,1][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.yt=tok[br]^.yt)and(tok[brl]^.xt=(tok[br]^.xt+brd))
then lgk[br,2][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=tok[br]^.xt)and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,3][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.yt=tok[br]^.yt)and(tok[brl]^.xt=(tok[br]^.xt-brd))
then lgk[br,4][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt+brd))and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,5][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt+brd))and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,6][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt-brd))and(tok[brl]^.yt=(tok[br]^.yt-brd))
then lgk[br,7][brd+2]:=tok[brl]^.ciji;
if (tok[brl]^.xt=(tok[br]^.xt-brd))and(tok[brl]^.yt=(tok[br]^.yt+brd))
then lgk[br,8][brd+2]:=tok[brl]^.ciji;
if brd=-1 then brd:=6;
end;
end;
end;
for br:=1 to brp do begin
for brt:=1 to 8 do begin
for brk:=1 to 3 do begin
case brk of 1:kk:='n'; 2:kk:='p'; 3:kk:='k'; end;
if (lgk[br,brt]=kk+'mmmmn') then skup(1,4,0);
if (lgk[br,brt]=kk+'mmmnm') then skup(1,3,0);
if (lgk[br,brt]=kk+'mmnmm') then skup(1,2,0);
if (lgk[br,brt]=kk+'mnmmm') then skup(1,1,0); end;
for brk:= 1 to 3 do begin
case brk of 1:kk:='m'; 2:kk:='k'; 3:kk:='n'; end;
if (lgk[br,brt]=kk+'ppppn') then skup(2,4,0);
if (lgk[br,brt]=kk+'pppnp') then skup(2,3,0);
if (lgk[br,brt]=kk+'ppnpp') then skup(2,2,0);
if (lgk[br,brt]=kk+'pnppp') then skup(2,1,0);
if (lgk[br,brt]='npnnn'+kk) then skup(198,1,-1);
if (lgk[br,brt]='mpnnn'+kk) then skup(199,1,0);
if (lgk[br,brt]='kpnnn'+kk) then skup(199,1,0); end;
if (lgk[br,brt]='nmmmnn') then skup(3,3,-1);
if (lgk[br,brt]='nmmmnp') then skup(3,3,-1);
if (lgk[br,brt]='nmmmnk') then skup(3,3,-1);
if (lgk[br,brt]='nmmnmn') then skup(3,2,-1);
if (lgk[br,brt]='nmnmmn') then skup(3,1,-1);
if (lgk[br,brt]='npppnn') then skup(20,3,-1);
if (lgk[br,brt]='nppnpn') then skup(20,2,-1);
if (lgk[br,brt]='npnppn') then skup(20,1,-1);
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]='npppn'+kk) then skup(20,3,-1);
if (lgk[br,brt]='nppnp'+kk) then skup(100,2,-1);
if (lgk[br,brt]='npnpp'+kk) then skup(100,1,-1); end;
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'pppnn') then skup(100,3,4);
if (lgk[br,brt]=kk+'ppnpn') then skup(100,2,4);
if (lgk[br,brt]=kk+'pnppn') then skup(100,1,4);
if (lgk[br,brt]=kk+'ppnnp') then skup(105,2,3);
if (lgk[br,brt]=kk+'pnpnp') then skup(105,1,3);
if (lgk[br,brt]=kk+'pnnpp') then skup(105,1,2); end;
for brk:= 1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mmmnn') then skup(102,3,4);
if (lgk[br,brt]=kk+'mmnmn') then skup(102,2,0);
if (lgk[br,brt]=kk+'mnmmn') then skup(102,1,0);
if (lgk[br,brt]='nmmnm'+kk) then skup(102,2,-1);
if (lgk[br,brt]='nmnmm'+kk) then skup(102,1,-1);
if (lgk[br,brt]=kk+'mmnnm') then skup(127,2,3);
if (lgk[br,brt]=kk+'mnmnm') then skup(127,1,3);
if (lgk[br,brt]=kk+'mnnmm') then skup(127,1,2); end;
if (lgk[br,brt]='nppnnp') then skup(104,2,3);
if (lgk[br,brt]='npnpnp') then skup(104,1,3);
if (lgk[br,brt]='npnnpp') then skup(104,1,2);
if (lgk[br,brt]='nmmnnm') then skup(126,2,3);
if (lgk[br,brt]='nmnmnm') then skup(126,1,3);
if (lgk[br,brt]='nmnnmm') then skup(126,1,2);
if (lgk[br,brt]='npnpnn') then skup(166,1,3);
if (lgk[br,brt]='nppnnn') then skup(166,2,3);
for brk:= 1 to 2 do begin
case brk of 1:kk:='m'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'pnpnn') then skup(168,1,3);
if (lgk[br,brt]=kk+'ppnnn') then skup(168,2,3);
if (lgk[br,brt]='npnpn'+kk) then skup(168,1,3);
if (lgk[br,brt]='nppnn'+kk) then skup(168,2,3);
if (lgk[br,brt]=kk+'pnnpn') then skup(170,1,2);
if (lgk[br,brt]=kk+'pnnnp') then skup(170,1,2);
if (lgk[br,brt]='npnnp'+kk) then skup(170,1,2); end;
if (lgk[br,brt]='npnnpn') then skup(169,1,2);
if (lgk[br,brt]='npnnnp') then skup(169,1,2);
if (lgk[br,brt]='nmnmnn') then skup(175,1,3);
if (lgk[br,brt]='nmmnnn') then skup(175,2,3);
for brk:= 1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mnmnn') then skup(190,1,3);
if (lgk[br,brt]=kk+'mmnnn') then skup(190,2,3);
if (lgk[br,brt]='nmnmn'+kk) then skup(190,1,3);
if (lgk[br,brt]='nmmnn'+kk) then skup(190,2,3);
if (lgk[br,brt]=kk+'mnnmn') then skup(192,1,2);
if (lgk[br,brt]=kk+'mnnnm') then skup(192,1,2);
if (lgk[br,brt]='nmnnm'+kk) then skup(192,1,2); end;
if (lgk[br,brt]='nmnnmn') then skup(191,1,2);
if (lgk[br,brt]='nmnnnm') then skup(191,1,2);
if (lgk[br,brt]='nmnnnn') then skup(196,-1,1);
for brk:=1 to 2 do begin
case brk of 1:kk:='p'; 2:kk:='k'; end;
if (lgk[br,brt]=kk+'mnnnn') then skup(197,1,0);
if (lgk[br,brt]='nmnnn'+kk) then skup(196,-1,1); end;
end;
end;
pri:=200;
for br:=1 to dpbr do begin
if (dpri[br]^.dpp=pri)or(brp=2) then begin Randomize; brt:=(Random(2))+1;
if brt=2 then brd:=br; end;
if dpri[br]^.dpp<pri then begin pri:=dpri[br]^.dpp; brd:=br; end;
if dpri[br]^.dpd<pri then begin pri:=dpri[br]^.dpd; brd:=br; end; end;
if pri<200 then begin x:=dpri[brd]^.xp; y:=dpri[brd]^.yp; end;
isto:=false; if (x=0)and(y=0) then isto:=true;
if not isto then for br:=1 to brp do
if (x=tok[br]^.xt)and(y=tok[br]^.yt) then isto:=true;
if isto then begin brd:=0; brt:=0;
repeat brd:=brd+1; repeat brt:=brt+1; isto:=false;
for br:=1 to brp do if (brd=tok[br]^.xt)and(brt=tok[br]^.yt) then isto:=true;
if (brt=21)and(isto) then brt:=0;
until (not isto)or(brt=0); until (not isto)or(brd>21); x:=brd; y:=brt; end;
brp:=brp+1; tok[brp]^.xt:=x; tok[brp]^.yt:=y; tok[brp]^.ciji:='m';
reset(F); seek(F, filesize(F)); Write(F, tok[brp]^);
Rewrite(E); Write(E, y, ' ', x); close(E);
end;
begin
for br:=1 to 440 do GetMem(tok[br], sizeof(xytok));
for br:=1 to 3520 do GetMem(dpri[br], sizeof(xydpri));
klinija; radi;
for br:=1 to 440 do FreeMem(tok[br], sizeof(xytok));
for br:=1 to 3520 do FreeMem(dpri[br], sizeof(xydpri));
end.