{ Delphi } {* * Problem : DESKTOP * Contest : UOI-2006 (Dnepropetrovsk) * Type : Solution * Date : March 30, 2006 * Author : Andrey Dereza * Language : Pascal * Compiler : Delphi 6.0 * Algorithm: Author Solution *} {$A+,B-,C-,D-,E-,F-,G+,H+,I-,J-,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y-,Z1} {$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00100000} {$IMAGEBASE $00400000} program desktop; {$APPTYPE CONSOLE} uses SysUtils; type TArr=array[0..999] of integer; var n,from,too:integer; verX:array[0..999] of integer; verY:array[0..999] of integer; verS:array[0..999] of string[50]; verText1:array[0..999] of integer; verTextPos:array[0..999] of integer; f:textfile; textCnt:array[0..25] of integer; textLink:array[0..25] of TArr;// ,0..999] of integer; qu:array[0..999] of integer; quLen:array[0..999] of integer; qustart,qucnt:integer; complete:array [0..999] of boolean; procedure push(num,len:integer); var nn:integer; begin nn:=quStart+quCnt; qu[nn]:=num; quLen[nn]:=len; Inc(quCnt); complete[num]:=true; end; function Work:integer; var len,sel,i,j:integer; k,nn,text1,textpos:integer; leftnum,rightnum,topnum,bottomnum:integer; ll,leftmin,rightmin,topmin,bottommin:double; dx,dy:integer; ddx,ddy:double; begin for i:=0 to n-1 do complete[i]:=false; qustart:=0; qucnt:=1; qu[0]:=from; qulen[0]:=0; complete[from]:=true; while qucnt>0 do begin sel:=qu[qustart]; len:=quLen[qustart]; Inc(quStart); Dec(quCnt); if sel=too then begin Result:=len; Exit; end; //literal text1:=verText1[sel]; textPos:=verTextPos[sel]; for i:=0 to 25 do if (i<>text1) and (textCnt[i]>0) and not complete[textLink[i][0]] then begin push(textlink[i][0],len+1); end; if (textCnt[text1]>1) then begin k:=TextPos+1; if k>=TextCnt[text1] then k:=0; if not complete[textlink[text1][k]] then begin push(textlink[text1][k],len+1); end; end; //arrow leftmin:=1e15; rightmin:=1e15; topmin:=1e15; bottommin:=1e15; for i:=0 to n-1 do if (i<>sel) then begin dx:=verX[i]-verX[sel]; dy:=verY[i]-verY[sel]; ddx:=dx; ddy:=dy; ll:=sqr(ddx)+sqr(ddy); if (dy>=dx) and (dx>=-dy) then //top if (lldx) and (dx<-dy) then //left if (ll-dy) then //right if (ll0} Result:=-1; end; procedure QuickSort(var A: TArr; iLo, iHi: Integer); var Lo, Hi, T: Integer; Mid:string; begin Lo := iLo; Hi := iHi; Mid := verS[A[(Lo + Hi) div 2]]; repeat while verS[A[Lo]] < Mid do Inc(Lo); while verS[A[Hi]] > Mid do Dec(Hi); if Lo <= Hi then begin T := A[Lo]; A[Lo] := A[Hi]; A[Hi] := T; Inc(Lo); Dec(Hi); end; until Lo > Hi; if Hi > iLo then QuickSort(A, iLo, Hi); if Lo < iHi then QuickSort(A, Lo, iHi); end; var res,i,j:integer; num:integer; ch:char; begin for i:=0 to 25 do textCnt[i]:=0; AssignFile(f,'desktop.dat'); Reset(f); ReadLn(f,n,from,too); Dec(from); Dec(too); for i:=0 to n-1 do begin Read(f,verX[i],verY[i]); ReadLn(f,ch,verS[i]); ch:=verS[i][1]; num:=Ord(ch)-97; textLink[num,TextCnt[num]]:=i; Inc(textCnt[num]); end; CloseFile(f); for i:=0 to 25 do begin if TextCnt[i]>1 then QuickSort(TextLink[i],0,TextCnt[i]-1); for j:=0 to TextCnt[i]-1 do begin verText1[TextLink[i][j]]:=i; verTextPos[TextLink[i][j]]:=j; end; end; res:=Work; AssignFile(f,'desktop.sol'); ReWrite(f); WriteLn(f,res); CloseFile(f); end.