Шахматы - Посчитать количество пустых клеток - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д