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

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

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

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

Доска 8х8

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

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

,

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

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

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

. Офицер -

по диагонали

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

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

. input ******** *RB***** ******** ******** ******** ******** ******** ******** output 47 input RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBBB RRRRRRRR BBBBBBB* output 0 Вот мой код, давайте попробуем исправить в нём ошибки
Листинг программы
  1. program uzas;
  2. var
  3. c: array [0..7] of array [0..7] of char;
  4. b: array [0..7] of array [0..7] of boolean;
  5. z, i, j, k: integer;
  6. begin
  7. Assign(input, 'input.txt');
  8. Assign(output, 'output.txt');
  9. reset(input);
  10. rewrite(output);
  11. for i := 0 to 7 do
  12. begin
  13. for j := 0 to 7 do
  14. begin
  15. Read(c[i, j]);
  16. end;
  17. readln;
  18. end;
  19. for i := 0 to 7 do
  20. begin
  21. for j := 0 to 7 do
  22. begin
  23. if c[i][j] = 'R' then
  24. begin
  25. for k := i + 1 to 7 do
  26. if c[k][j] = '*' then
  27. b[k][j] := True
  28. else
  29. break;
  30. for k := i - 1 downto 0 do
  31. if c[j][k] = '*' then
  32. b[j][k] := True
  33. else
  34. break;
  35. for k := j - 1 to 7 do
  36. if c[k][j] = '*' then
  37. b[k][j] := True
  38. else
  39. break;
  40. for k := j + 1 to 7 do
  41. if c[k][j] = '*' then
  42. b[k][j] := True
  43. else
  44. break;
  45. end;
  46. end;
  47. end;
  48. for i := 0 to 7 do
  49. begin
  50. for j := 0 to 7 do
  51. begin
  52. if c[i][j] = 'B' then
  53. begin
  54. b[i][j] := True;
  55. for k := 0 to 7 do
  56. if b[i][j] = True then
  57. break
  58. else
  59. begin
  60. b[i + k][j + k] := True;
  61. end;
  62. for k := 0 to 7 do
  63. b[i + k][j + k] := True;
  64. for k := 0 to 7 do
  65. b[i + k][j - k] := True;
  66. for k := 0 to 7 do
  67. b[i - k][j + k] := True;
  68. for k := 0 to 7 do
  69. b[i - k][j - k] := True;
  70. end;
  71. end;
  72. end;
  73. for i := 0 to 7 do
  74. begin
  75. for j := 0 to 7 do
  76. begin
  77. if c[i][j] = 'B' then
  78. begin
  79. b[i][j] := True;
  80. end;
  81. end;
  82. END;
  83.  
  84. for i := 0 to 7 do
  85. begin
  86. for j := 0 to 7 do
  87. begin
  88. if c[i][j] = 'R' then
  89. begin
  90. b[i][j] := True;
  91. end;
  92. end;
  93. end;
  94. for i := 0 to 7 do
  95. begin
  96. for j := 0 to 7 do
  97. begin
  98. if b[i][j] = False then
  99. z := z + 1;
  100. end;
  101. end;
  102. Write(z);
  103. Close(input);
  104. Close(output);
  105. end.

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

textual
Листинг программы
  1. const n=7;
  2. var
  3.   a: array [0..n,0..n+1] of Char;
  4.   i, j, p, q, s: Integer;
  5. begin
  6.   for i:=0 to n do ReadLn(a[i]); {s:=0;}
  7.   for i:=0 to n do for j:=0 to n do
  8.     case a[i,j] of
  9.     'B': { слон }
  10.       begin
  11.         p:=i-1; q:=j-1;
  12.         while (p>=0) and (q>=0) and (a[p,q] in ['*','#']) do begin
  13.           a[p,q]:='#'; Dec(p); Dec(q);
  14.         end;
  15.         p:=i+1; q:=j+1;
  16.         while (p<=n) and (q<=n) and (a[p,q] in ['*','#']) do begin
  17.           a[p,q]:='#'; Inc(p); Inc(q);
  18.         end;
  19.         p:=i-1; q:=j+1;
  20.         while (p>=0) and (q<=n) and (a[p,q] in ['*','#']) do begin
  21.           a[p,q]:='#'; Dec(p); Inc(q);
  22.         end;
  23.         p:=i+1; q:=j-1;
  24.         while (p<=n) and (q>=0) and (a[p,q] in ['*','#']) do begin
  25.           a[p,q]:='#'; Inc(p); Dec(q);
  26.         end;
  27.       end;
  28.     'R': { ладья }
  29.       begin
  30.         for p:=i-1 downto 0 do if a[p,j] in ['*','#'] then a[p,j]:='#' else Break;
  31.         for p:=i+1 to n do     if a[p,j] in ['*','#'] then a[p,j]:='#' else Break;
  32.         for q:=j-1 downto 0 do if a[i,q] in ['*','#'] then a[i,q]:='#' else Break;
  33.         for p:=j+1 to n do     if a[i,q] in ['*','#'] then a[i,q]:='#' else Break;
  34.       end;
  35.     end;
  36.   for i:=0 to n do for j:=0 to n do Inc(s,Ord(a[i,j]='*'));
  37.   WriteLn(s);
  38. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы