Шахматы - Посчитать количество пустых клеток - Free Pascal

Узнай цену своей работы

Формулировка задачи:

На доске стоит несколько офицеров и ладей. Требуется посчитать количество свободных клеток, которые не находятся под боем ни одной из фигур.

Доска 8х8

. В первых восьми строках входного файла описывается доска. Первые восемь символов каждой из этих строк описывают состояние соответствующей горизонтали:

символ B (заглавная латинская буква) означает, что в клетке стоит офицер

,

символ R — ладья, символ * — что клетка пуста.

Итак, а теперь некоторые нюансы. Если вдруг ладья уперлась в офицера или наоборот, то дальше мы не заполняем строчки. Примечание: Ладья ходит на этой доске -

вверх, вниз, вправо, влево

. Офицер -

по диагонали

(левая, правая).

Требуется посчитать количество пустых клеток - *

. input ******** *RB***** ******** ******** ******** ******** ******** ******** output 47 input RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBB* output 0 Вот мой код, давайте попробуем исправить в нём ошибки
program uzas;
 
var
  c: array [0..7] of array [0..7] of char;
  b: array [0..7] of array [0..7] of boolean;
  z, i, j, k: integer;
begin
  Assign(input, 'input.txt');
  Assign(output, 'output.txt');
  reset(input);
  rewrite(output);
  for i := 0 to 7 do
  begin
    for j := 0 to 7 do
    begin
      Read(c[i, j]);
    end;
    readln;
  end;
  for i := 0 to 7 do
  begin
    for j := 0 to 7 do
    begin
      if c[i][j] = 'R' then
      begin
        for k := i + 1 to 7 do
          if c[k][j] = '*' then
            b[k][j] := True
          else
            break;
        for k := i - 1 downto 0 do
          if c[j][k] = '*' then
            b[j][k] := True
          else
            break;
        for k := j - 1 to 7 do
          if c[k][j] = '*' then
            b[k][j] := True
          else
            break;
        for k := j + 1 to 7 do
          if c[k][j] = '*' then
            b[k][j] := True
          else
            break;
      end;
    end;
  end;
  for i := 0 to 7 do
  begin
    for j := 0 to 7 do
    begin
      if c[i][j] = 'B' then
      begin
        b[i][j] := True;
        for k := 0 to 7 do
          if b[i][j] = True then
            break
          else
          begin
            b[i + k][j + k] := True;
          end;
        for k := 0 to 7 do
          b[i + k][j + k] := True;
        for k := 0 to 7 do
          b[i + k][j - k] := True;
        for k := 0 to 7 do
          b[i - k][j + k] := True;
        for k := 0 to 7 do
          b[i - k][j - k] := True;
      end;
    end;
  end;
  for i := 0 to 7 do
  begin
  for j := 0 to 7 do
  begin
  if c[i][j] = 'B' then
      begin
        b[i][j] := True;
 
      end;
  end;
  END;

    for i := 0 to 7 do
  begin
  for j := 0 to 7 do
  begin
  if c[i][j] = 'R' then
      begin
        b[i][j] := True;
  end;
  end;
  end;
  for i := 0 to 7 do
  begin
    for j := 0 to 7 do
    begin
      if b[i][j] = False then
        z := z + 1;
    end;
  end;
  Write(z);
  Close(input);
  Close(output);
end.

Решение задачи: «Шахматы - Посчитать количество пустых клеток»

textual
Листинг программы
const n=7;
var
  a: array [0..n,0..n+1] of Char;
  i, j, p, q, s: Integer;
begin
  for i:=0 to n do ReadLn(a[i]); {s:=0;}
  for i:=0 to n do for j:=0 to n do
    case a[i,j] of
    'B': { слон }
      begin
        p:=i-1; q:=j-1;
        while (p>=0) and (q>=0) and (a[p,q] in ['*','#']) do begin
          a[p,q]:='#'; Dec(p); Dec(q);
        end;
        p:=i+1; q:=j+1;
        while (p<=n) and (q<=n) and (a[p,q] in ['*','#']) do begin
          a[p,q]:='#'; Inc(p); Inc(q);
        end;
        p:=i-1; q:=j+1;
        while (p>=0) and (q<=n) and (a[p,q] in ['*','#']) do begin
          a[p,q]:='#'; Dec(p); Inc(q);
        end;
        p:=i+1; q:=j-1;
        while (p<=n) and (q>=0) and (a[p,q] in ['*','#']) do begin
          a[p,q]:='#'; Inc(p); Dec(q);
        end;
      end;
    'R': { ладья }
      begin
        for p:=i-1 downto 0 do if a[p,j] in ['*','#'] then a[p,j]:='#' else Break;
        for p:=i+1 to n do     if a[p,j] in ['*','#'] then a[p,j]:='#' else Break;
        for q:=j-1 downto 0 do if a[i,q] in ['*','#'] then a[i,q]:='#' else Break;
        for p:=j+1 to n do     if a[i,q] in ['*','#'] then a[i,q]:='#' else Break;
      end;
    end;
  for i:=0 to n do for j:=0 to n do Inc(s,Ord(a[i,j]='*'));
  WriteLn(s);
end.

Объяснение кода листинга программы

  1. Объявлены переменные: n, a, i, j, p, q, s (номер 7)
  2. Заполняется массив a (номер 8)
  3. Создаются условные конструкции для каждой клетки массива a (номера 9-12)
  4. В случае, если в массиве a встречается символ 'B', то выполняется код для слона (номера 13-17)
  5. Если в массиве a встречается символ 'R', то выполняется код для ладьи (номера 18-20)
  6. Инициализируется переменная s (номер 21)
  7. Выполняется цикл для подсчета количества пустых клеток (номер 22)
  8. Выводится значение переменной s (номер 23)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы