Шахматы - Посчитать количество пустых клеток - 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.
Объяснение кода листинга программы
- Объявлены переменные: n, a, i, j, p, q, s (номер 7)
- Заполняется массив a (номер 8)
- Создаются условные конструкции для каждой клетки массива a (номера 9-12)
- В случае, если в массиве a встречается символ 'B', то выполняется код для слона (номера 13-17)
- Если в массиве a встречается символ 'R', то выполняется код для ладьи (номера 18-20)
- Инициализируется переменная s (номер 21)
- Выполняется цикл для подсчета количества пустых клеток (номер 22)
- Выводится значение переменной s (номер 23)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д