Заметим, что шахматную доску удобно представить в виде двумерного массива размером 8х8. Координаты ферзя можно задать двумя числами (номером строки и номером столбца), но в шахматах принято указывать букву и число. Буква указывает номер строки, а число − номер столбца. Поэтому не будем отступать от традиций и введем координаты именно таким образом. В программе сделаем проверку правильности ввода, и если все правильно, то переведем букву в соответствующее ей число (a-1, b-2, c-3, d-4, е-5, f-6, g-7, h-8), тогда будет удобнее работать.
Для решения задачи полезно знать следующие свойства шахматной доски. Все диагонали делятся на восходящие и нисходящие:
Каждая диагональ обладает следующими свойствами:
· для элементов любой восходящей диагонали сумма номеров строки и столбца постоянна, причем для разных диагоналей − разная, то есть i+j=const1;
· для элементов нисходящих диагоналей разность номеров строки и столбца тоже постоянна и для разных диагоналей разная, то есть i-j=const2.
Это необходимо знать для того, чтобы определить номера диагоналей, на которых находится ферзь. Вся программа будет такой:
Program Example_120;
Const n=8;
Type dmyarray=Array[1..n,1..n] Of Integer;
Var A: dmyarray;
c: Char;
str, stl: Integer;
{str - номер строки, stl - номер столбца}
Function Place(ch: Char): Integer;
Var k: Integer;
Begin
Case ch Of
'a': k:=1; 'b': k:=2; 'c': k:=3;
'd': k:=4; 'e': k:=5; 'f: k:=6;
'g': k:=7; 'h': k:=8;
Place:=k;
End;
Procedure Init(k, l: Integer;
Var x: dmyarray);
{k - номер строки, l - номер столбца, где стоит ферзь}
Var i, j: Integer;
Begin
For i:=1 To n Do
For j:=1 To n Do {Под боем клетки,
находящиеся с клеткой, на которой стоит
ферзь, на одной вертикали, горизонтали,
восходящей или нисходящей диагонали.
Клетки, находящиеся под боем, мы
помечаем 1, остальные помечаем 0.}
If (i=k) Or (j=1) Or (i+j=k+1)
Or (i-j=k-l)
Then x[i, j]:=1 Else x[i, j]:=0;
x[k, l]:=2;
{На этой клетке стоит ферзь}
End;
Procedure Print(x: dmyarray);
Var i, j: Integer;
Begin
For i:=1 To n Do
Begin
For j:=1 To n Do
Case x[i, j] Of
0: Write (' ':3);
1: Write ('*':3);
2: Write ('F':3);
End;
Writeln;
End;
Begin
Writeln('Введите координаты ферзя');
Readln(с, stl);
If (c<'a') Or (c>'h') Or (stl<1)
Or (stl>n) Then
Writeln('Некорректный ввод')
Else
Begin
str:=Place(с);
Init(str, stl, A);
Print(A);
End;
Readln;
End.
Можно функцию Place составить иначе:
Function Place(ch: Char): Integer;
Var k: Integer;
Begin
Place:=0rd(ch)-Ord('a')+1;
End;
В этом случае она будет более рациональна.
Пример 2
Заполнить массив А размером n×m следующим образом (по "змейке");