Advertisement
Guest User

Untitled

a guest
Aug 16th, 2011
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.56 KB | None | 0 0
  1. program solution;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {MODE DELPHI}
  5. {$MAXSTACKSIZE 1000000000}
  6. {O-,R+,Q+}
  7. {$O+,R-,Q-}
  8.  
  9. uses
  10.   SysUtils,
  11.   Math;
  12.  
  13. const
  14.   inf = round(1e9);
  15.  
  16. var
  17.   x, y, ans, res, k, i, j, z : integer;
  18.   used : array[0..9, 0..9] of boolean;
  19.   a : array[0..9, 0..9] of char;
  20.   dx, dy : array[0..5] of integer;
  21.   ax, ay : array[0..301] of integer;
  22.   ach : array[0..301] of char;
  23.  
  24. procedure swap(var a, b : char);
  25. var c : char;
  26. begin
  27.   c := a;
  28.   a := b;
  29.   b := c;
  30. end;
  31.  
  32. procedure getch(var ch : char);
  33. begin
  34.   read(ch);
  35.   while not (ch in ['a'..'z', 'A'..'Z']) do
  36.     read(ch);
  37. end;
  38.  
  39. function good(x, y : integer) : boolean;
  40. begin
  41.   result := (x >= 1) and (x <= 8) and (y >= 1) and (y <= 8);
  42. end;
  43.  
  44. function calc() : integer;
  45. var sz, x, y, i, j, z : integer;
  46. begin
  47.   for i := 1 to 8 do
  48.     for j := 1 to 8 do
  49.       used[i, j] := false;
  50.   for i := 1 to 8 do
  51.     for j := 1 to 8 do
  52.       for z := 1 to 4 do begin
  53.         sz := 1;
  54.         x := i;
  55.         y := j;
  56.         while (good(x + dx[z], y + dy[z])) and (a[x + dx[z], y + dy[z]] = a[i, j]) do begin
  57.           inc(sz);
  58.           x := x + dx[z];
  59.           y := y + dy[z];
  60.         end;
  61.         if sz >= 3 then begin
  62.           used[i, j] := true;
  63.           x := i;
  64.           y := j;
  65.           while (good(x + dx[z], y + dy[z])) and (a[x + dx[z], y + dy[z]] = a[i, j]) do begin
  66.             x := x + dx[z];
  67.             y := y + dy[z];
  68.             used[x, y] := true;
  69.           end;
  70.         end;
  71.       end;
  72.   result := 0;
  73.   for i := 1 to 8 do
  74.     for j := 1 to 8 do
  75.       if used[i, j] then
  76.         inc(result);
  77. end;
  78.  
  79. function less(a, b : integer) : boolean;
  80. begin
  81.   if ax[a] <> ax[b] then begin
  82.     result := ax[a] < ax[b];
  83.     exit;
  84.   end;
  85.   if ay[a] <> ay[b] then begin
  86.     result := ay[a] < ay[b];
  87.     exit;
  88.   end;
  89.   result := ach[a] < ach[b];
  90. end;
  91.  
  92. begin
  93.   //assign(input, 'input.txt'); reset(input);
  94.   //assign(output, 'output.txt'); rewrite(output);
  95.   dx[1] := -1;
  96.   dy[2] := 1;
  97.   dx[3] := 1;
  98.   dy[4] := -1;
  99.   for i := 1 to 8 do
  100.     for j := 1 to 8 do
  101.       getch(a[i, j]);
  102.   ans := -inf;
  103.   for i := 1 to 8 do
  104.     for j := 1 to 8 do
  105.       for z := 1 to 4 do begin
  106.         x := i + dx[z];
  107.         y := j + dy[z];
  108.         if good(x, y) then begin
  109.           swap(a[i, j], a[x, y]);
  110.           res := calc();
  111.           swap(a[i, j], a[x, y]);
  112.           if res > ans then begin
  113.             ans := res;
  114.             k := 1;
  115.             if i = x then begin
  116.               ax[1] := i - 1;
  117.               ay[1] := min(j, y) - 1;
  118.               ach[1] := 'R';
  119.             end
  120.             else begin
  121.               ax[1] := min(i, x) - 1;
  122.               ay[1] := j - 1;
  123.               ach[1] := 'D';
  124.             end;
  125.           end
  126.           else
  127.             if res = ans then begin
  128.               inc(k);
  129.               if i = x then begin
  130.                 ax[k] := i - 1;
  131.                 ay[k] := min(j, y) - 1;
  132.                 ach[k] := 'R';
  133.               end
  134.               else begin
  135.                 ax[k] := min(i, x) - 1;
  136.                 ay[k] := j - 1;
  137.                 ach[k] := 'D';
  138.               end;
  139.             end;
  140.         end;
  141.       end;
  142.   for i := 1 to k - 1 do
  143.     for j := k downto i + 1 do
  144.       if less(j, i) then begin
  145.         z := ax[i];
  146.         ax[i] := ax[j];
  147.         ax[j] := z;
  148.         z := ay[i];
  149.         ay[i] := ay[j];
  150.         ay[j] := z;
  151.         swap(ach[i], ach[j]);
  152.       end;
  153.   writeln(ans);
  154.   writeln(ax[1], ' ', ay[1], ' ', ach[1]);
  155.   for i := 2 to k do
  156.     if less(i - 1, i) then
  157.       writeln(ax[i], ' ', ay[i], ' ', ach[i]);
  158. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement