Главная » Статьи » Задачи с acm.timus.ru » Пакет решений на 15.03.08 |
1298
{ $A+,B-,D-,E+,F-,G-,I+,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+} {$M 65520,0,655360} const maxn=20; maxm=maxn; maxmn=maxm*maxn; dx:array[1..8]of integer=(-2,-1,1,2, 2, 1,-1,-2); dy:array[1..8]of integer=( 1, 2,2,1,-1,-2,-2,-1); letters: array[1..11]of char=('a','b','c','d','e','f','g','h','i','j','k'); var b: array[-1..maxn+2,-1..maxm+2]of integer; path:array[1..maxmn,1..2]of integer; var n: integer; nm: integer; procedure ReadData; begin Readln(n); nm:=n*n; end; procedure Solve(x,y: integer; i: integer; var yes: boolean); var xn,yn,xnn,ynn: integer; j,k,m: integer; min: integer; w:array[1..8]of integer; begin for j:=1 to 8 do begin xn:=x+dx[j]; yn:=y+dy[j]; if B[xn,yn]=0 then begin W[j]:=0; for k:=1 to 8 do begin xnn:=xn+dx[k]; ynn:=yn+dy[k]; if B[xnn,ynn]=0 then inc(w[j]); end; end else W[j]:=maxint; end; j:=0; repeat Inc(j); m:=1; min:=w[1]; for k:=2 to 8 do if W[k]<min then begin m:=k; min:=w[k]; end; if min<>maxint then begin xn:=x+dx[m]; yn:=y+dy[m]; B[xn,yn]:=i; path[i,1]:=yn; path[i,2]:=xn; if i<>NM then begin Solve(xn,yn,i+1,Yes); W[m]:=Maxint; end else Yes:=true; if not yes then B[xn,yn]:=0; end; until (j=8)or Yes; end; procedure print; var i,j: integer; begin for i:=1 to nm do writeln(letters[path[i,1]],path[i,2]); end; var i,j: integer; yes: boolean; begin readdata; for i:=-1 to n+2 do for j:=-1 to n+2 do B[i,j]:=-1; for i:=1 to n do for j:=1 to n do B[i,j]:=0; if n=1 then begin writeln('a1');exit; end; Yes:=false; i:=1; while (i<=n div 2)and not yes do begin j:=1; while (j<=n div 2)and not yes do begin B[i,j]:=1; path[1,1]:=i; path[1,2]:=j; Solve(i,j,2,yes); if not yes then b[i,j]:=0; inc(j); end; inc(i); end; if not yes then writeln('IMPOSSIBLE') else print; end. | |
Категория: Пакет решений на 15.03.08 | Добавил: solver (15.03.2008) | |
Просмотров: 1672 |