t1nman

horse_way

May 4th, 2012
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.52 KB | None | 0 0
  1. const
  2.     maxsize = 30;
  3.     Movs: array [1..8, 1..2] of integer = (
  4.         (1, 2), (1, -2), (-1, 2), (-1, -2),
  5.         (2, 1), (2, -1), (-2, 1), (-2, -1)
  6.     );
  7.  
  8. type
  9.     TArray = array [1..maxsize, 1..maxsize] of integer;
  10.  
  11.  
  12. procedure Inp(var side, x0, y0: integer);
  13. var
  14.     Fin: Text;
  15. begin
  16.     assign(Fin,'input.txt');
  17.     reset(Fin);
  18.     readln(Fin,side,x0,y0);
  19.     close(Fin);
  20. end;
  21.  
  22. procedure Init(var A: TArray; side: integer);
  23. var
  24.     i, j: byte;
  25. begin
  26.     for i:=1 to side do
  27.         for j:=1 to side do
  28.             A[i,j]:=0;
  29. end;
  30.  
  31.  
  32. function Path(cur_x, cur_y, mov_num, side: integer; var desk: TArray; access: TArray): boolean;
  33. var
  34.     i, next_x, next_y, x, y, min: integer;
  35. begin
  36.     desk[cur_x,cur_y]:=mov_num;
  37.     Path:=(mov_num = side*side);
  38.     if Path then
  39.         exit;
  40.  
  41.     min:=10;
  42.     for i:=1 to 8 do
  43.     begin
  44.         next_x:=cur_x + Movs[i,1];
  45.         next_y:=cur_y + Movs[i,2];
  46.         if not ((next_x in [1..side]) and (next_y in [1..side])) then
  47.             continue;
  48.         if desk[next_x,next_y] <> 0 then
  49.             continue;
  50.         if (access[next_x,next_y] < min) then
  51.         begin
  52.             min:=access[next_x,next_y];
  53.             x:=next_x;
  54.             y:=next_y;
  55.         end;
  56.         Path:=Path(x,y,mov_num+1,side,desk,access);
  57.         if Path then exit;
  58.     end;
  59.  
  60.     if not Path then
  61.         desk[cur_x, cur_y]:=0;
  62. end;
  63.  
  64. procedure Outp(desk,access: TArray; side,x0,y0: integer);
  65. var
  66.     i, j: integer;
  67.     Fout: Text;
  68. begin
  69.     assign(Fout,'output.txt');
  70.     rewrite(Fout);
  71.  
  72.     if Path(x0,y0,1,side,desk,access) then
  73.         for i:=1 to side do
  74.         begin
  75.             for j:=1 to side do
  76.                 write(Fout,desk[i,j]:2,' ');
  77.             writeln(Fout);
  78.         end
  79.     else
  80.         writeln(Fout,'Маршрут не существует');
  81.     close(Fout);
  82. end;
  83.  
  84. procedure MakeAxs(var A: TArray; side: integer);
  85. var
  86.     k,i,j,stepx,stepy,n: integer;
  87. begin
  88.     for i:=1 to side do
  89.         for j:=1 to side do  
  90.         begin
  91.             n:=0;
  92.             for k:=1 to 8 do
  93.             begin
  94.                 stepx:=i+Movs[k,1];
  95.                 stepy:=j+Movs[k,2];
  96.                 if ((stepx in [1..side]) and (stepy in [1..side])) then  
  97.                 inc(n);
  98.             end;
  99.             A[i,j]:=n;
  100.         end;
  101. end;    
  102.  
  103. var
  104.     side, x0, y0: integer;
  105.     desk, access: TArray;
  106. begin
  107.     Inp(side,x0,y0);
  108.     Init(desk,side);
  109.     Init(access,side);
  110.     MakeAxs(access,side);
  111.     Outp(desk,access,side,x0,y0);
  112. end.
Advertisement
Add Comment
Please, Sign In to add comment