Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие для учеников .doc
Скачиваний:
12
Добавлен:
18.12.2018
Размер:
2.27 Mб
Скачать

§47. Заполнение двухмерного массива по правилу

Пример

Составить программу, запрашивающую координаты ферзя на шахматной доске и показывающую поля дос­ки, находящиеся под боем (на доске нет других фигур).

Решение

Заметим, что шахматную доску удобно представить в виде двумерного массива размером 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 следующим об­разом (по "змейке");

Например, при n=6 и m=8:

1 2 3 4 5 6 7 8

16 15 14 13 12 11 10 9

17 18 19 20 21 22 23 24

32 31 30 29 28 27 26 25

33 34 35 36 37 38 39 40

48 47 46 45 44 43 42 41