Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Пример 10

Двумерные массивы | Найти сумму элементов | Пример 3 | Пример 5 | Пример 13 |


Читайте также:
  1. I) Эффективность военных преобразований 1860-1870-х годов на примере Русско-японской войны.
  2. I. Примерный перечень вопросов рубежного контроля.
  3. II. Примерный перечень вопросов к зачету (экзамену) по всему курсу.
  4. III. РАЗЛИЧНЫЕ СХЕМЫ УПРАВЛЕНИЯ ГОСУДАРСТВЕННОЙ СОБСТВЕННОСТЬЮ: ПРИМЕРЫ ИЗ ИСТОРИЧЕСКОГО ОПЫТА И ЗАРУБЕЖНОЙ ПРАКТИКИ
  5. Look at the family tree and complete the sentences as in the example (Посмотри на семейное древо и заполни пропуски как в примере).
  6. Lt;question>Выберите правильный пример аннотации.
  7. XVI. Переведите на калмыцкий язык, заменяя подчеркнутые слова предложенными примерами.

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

Решение

1. Заметим, что шахматную доску удобно представить в виде двумерного массива размером 8*8. Координаты ферзя можно вводить двумя числами (номер строки и номер столбца), но в шахматах принято вводить букву и число. Буква отвечает за номер строки, а число - за номер столбца. Поэтому не будем отступать от традиций и введём координаты именно таким образом. В программе сделаем проверку правильности ввода и если всё правильно, то переведём букву в соответствующее ей число ('а'-1, 'b'-2,'c'-3,'d'-4,'e'-5,'f''-6,'g'-7,'h'-8), тогда будет удобнее работать.

2. Для решения надо ещё знать следующие свойства шахматной доски. Все диагонали делятся на восходящие и нисходящие.

Для любой восходящей диагонали сумма номера строки и номера столбца постоянна и для разных диагоналей - разная, то есть i + j = const1.

Для нисходящих - разность номера строки и номера столбца постоянны и для разных диагоналей - разная, то есть i - j = const2.

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

Вся программа будет такой:

Program Exampl_47;
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;
End;
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=1) Or (j=1) Or (i+j=k+1) Or (i-j=k-1)
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
Writeln('Введи координаты ферзя ');
Readln(c, stl);
If (c<'a') Or (c>'h') Or (stl<1) Or (stl>n)
Then Writeln ('некорректный ввод')
Else
Begin
str:= Place(c);
Init(str,stl, A);
Print(A);
End;
Readln;
End.

Можно функцию Place составить иначе:

Function Place(ch: Char): Integer;
Var k: Integer;
Begin
Place:=Ord(ch)- Ord('a')+1;
End;

В этом случае она будет более рациональна.


Дата добавления: 2015-08-17; просмотров: 43 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Пример 7| Пример 12

mybiblioteka.su - 2015-2024 год. (0.006 сек.)