Помощь - Поиск - Пользователи - Календарь
Полная версия: Шахматная задача
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Hindelberg
Задача: НА шахматной доске слон и ладья(белые). НАйти сколько на доске клеток, куда можно поставить черную пешку чтобы ее нельзя было срубить слоном или ладьей. Это я сделал.

Код

if (i+j=cs+bs) or (i-j=cs-bs) then
mas[i,j]:=1;
end;
mas[cs,bs]:=2;
for i:=1 to n do
for j:=1 to n do
begin
if (i=cl) or (j=bl) then
mas[i,j]:=1;
end;
mas[cl,bl]:=3;
for i:=n downto 3 do
for j:=1 to n do
if mas[i,j]=0 then s:=s+1;


cl, cs - цифра ладьи и слона соответственно
bl, bs - буква ладьи и слона соответственно

В этом решении я не учел, что фигуры не могут прыгать друг через друга.
Как это сделать? rolleyes.gif
Hindelberg
Неужели ни у кого нету никаких предложений??
volvo
To: Hindelberg
Я понимаю ,это выглядит ужасно, но я бы сразу делал проверку бьющихся полей с учетом того, закрывается ли одна фигура другой:
const
  n = 8;
var
  arr: array[1 .. n, 1 .. n] of integer;

var
  i, j: integer;
const
  cs = 2; bs = 2;
  bl = 2; cl = 5;

begin
  for i := 1 to n do
    for j := 1 to n do
      arr[i, j] := 0;

  arr[cl, bl] := 0;
  arr[cs, bs] := 2;

  j := pred(bl);
  while (j > 1) and (arr[cl, j] < 2) do dec(j);
  while (j < 9) and (arr[cl, j] < 2) do begin
    arr[cl, j] := 1; inc(j);
  end;

  i := pred(cl);
  while (i > 0) and (arr[i, bl] < 2) do dec(i);
  inc(i);
  while (i < 9) and (arr[i, bl] < 2) do begin
    arr[i, bl] := 1; inc(i);
  end;

  arr[cl, bl] := 3;
  arr[cs, bs] := 0;

  i := bs;
  while (i > 0) and (cs - (bs-i) > 0) and (arr[cs - (bs - i), i] < 2) do dec(i);
  inc(i);
  while (i < 9) and (cs - (bs-i) < 9) and (arr[cs - (bs - i), i] < 2) do begin
    arr[cs - (bs - i), i] := 1; inc(i);
  end;

  i := bs;
  while (i > 0) and (cs + (bs-i) in [1 .. 8]) and (arr[cs + (bs - i), i] < 2) do dec(i);
  inc(i);
  while (i < 9) and (cs + (bs-i) < 9) and (arr[cs + (bs - i), i] < 2) do begin
    arr[cs + (bs - i), i] := 1; inc(i);
  end;

  arr[cl, bl] := 3;
  arr[cs, bs] := 2;

  for i := 1 to n do begin
    for j := 1 to n do
      write(arr[i, j]:2);
    writeln
  end;
  writeln;

  {
    Здесь - подсчет нулевых полей ...
  }
end.
wacko.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.