Шахматы - Посчитать количество пустых клеток - 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)