
- •1. Сортування
- •1.1. Сортування масивів
- •1. Сортування простими включеннями;
- •2. Сортування простим вибором;
- •1.1.1. Сортування простими включеннями
- •1.1.2. Сортування простим вибором
- •1.1.3. Сортування простим обміном (засіб “бульбашки”)
- •1.1.4. Шейкер-сортування
- •1.1.5. Швидке сортування
- •1.2. Сортування масива рядків
- •1.3. Сортування файлів
- •2. Рекурсивні алгоритми
- •2.1. Алгоритми з поверненням
- •2.1.1. Шахова задача про хід коня
- •2.1.2. Шахова задача про вісім ферзів
- •3. Динамічні інформаційні структури
- •3.1. Динамічні змінні. Вказівники
- •3.1.1. Засоби створення та використання динамічних даних
- •3.2. Рекурсивні типи даних
- •3.3. Списки
- •3.3.2. Двозв’язні та кiльцевi списки
- •3.3.3. Черги і стеки
- •3.4. Деревовидні структури
- •3.4.1. Бінарні дерева
- •3.4.2. Ідеально збалансовані дерева
- •3.4.3. Дерева пошуку
- •3.4.4. Збалансовані дерева (авл-дерева)
- •4. Завдання до лабораторних та контрольних робіт.
- •4.1. Сортування.
- •4.2. Списки.
2.1.2. Шахова задача про вісім ферзів
Треба розставити вісім ферзів на шаховій дошці таким чином, щоб ні один з них не погрожував іншому.
Hеобхідно вибрати подання даних. Ферзь може бити фігури, що розташовані по вертикалі, горизонталі, діагоналям. Відповідно, кожна вертикаль може мати на собі тільки одного ферзя (дошка 8х8). Вибір позиції обмежується вісім’ю можливими значеннями індекса по горизонталі (j).
По аналогії з попередньою задачею дошку можна було б зобразити у вигляді квадратної матриці. Але в цьому випадку перевірка безпечної позиції виявилася б дуже складною.
Виходячи з того, що ферзь розташований на кожній вертикалі, перевіряється, чи вільні для даної позиції відповідна горизонталь і діагональ.
Зробимо опис даних:
Var
x:array [1..8] Of integer;
a:array [1..8] Of boolean;
b:array [2..16] Of boolean;
c:array [-7..7] Of boolean;
де:
x[i] – позиція ферзя на i-той вертикалі;
a[i]=true – на j-тій горизонталі ферзя немає;
b[i]=true – на к-тій діагоналі напрямку (/) ферзя немає;
c[i]=true – на к-тій діагоналі напрямку (\) ферзя немає;
Hа / – діагоналі всі поля мають однакову сумму індексів i+j;
На \ – діагоналі всі поля мають однакову різницю індексів i-j.
Тому для b[2,16] – мінімальна та максимальна сума індексів:
(1+1, 8+8)
a для с[-7,7] – мінімальна та максімальна різниця індексів:
(1-8, 8-1)
Поставити ферзя – це означає наступне:
x[i]:=j; наприклад, 1-й ферзь у 1-ому рядку – x[1]=1, 7-й ферзь у 2-ому рядку – x[7]=2;
a[j]:=false; ферзь є у цьому рядку;
b[i+j]:=false; ферзь є на діагоналі /;
c[i-j]:=false; ферзь є на діагоналі \ .
Забрати ферзя означає наступне:
a[j]:=true;
b[j]:=true;
c[j]:=true;
Умови безпечного розташування ферзя:
a[j] and b[i+j] and c[i-j] {тобто всі дорівнюють true}
Загальна схема алгоритма.
Procedure Try(i:integer);
Begin
<ініціювати вибір для і-того ферзя>
Repeat
<вибрати позицію>
If <безпечно> Then
Begin
<поставити ферзя>
If i<8 Then
Begin
Try(i+1)
If <невдача> Then
<забрати ферзя>
End
End
Until <вдало> or <більше немає позиції>
End
{ Вісім ферзів (одне рішення) }
Var
i : integer;
a : array [1..8] Of boolean;
b : array [2..16] Of boolean;
c : array [-7..7] Of boolean;
x : array [1..8] Of integer;
q: boolean;
Procedure Try(i:integer; Var q:boolean);
Var
j : integer;
Begin
j:=0;
Repeat
j:=j+1;
q:=false;
If a[j] and b[i+j] and c[i-j] Then
Begin
x[i]:=j;
a[j]:=false;
b[i+j]:=false;
c[i-j]:=false;
If i<8 Then
Begin
Try(i+1,q);
If Notq Then
Begin
a[j]:=true;
b[i+j]:=true;
c[i-j]:=true;
End;
End
Else
q:=true;
End
Until q or (j=8);
End ;{Try}
{———————————————}
Begin
For i:=1 To 8 Do a[i]:=true;
For i:=2 To 16 Do b[i]:=true;
For i:= -7 To 7 Do c[i]:=true;
Try(1,q);
If q Then
For i:=1 To 8 Do Write (x[i]:4);
Writeln;
End.
3. Динамічні інформаційні структури
Після аналізу розділу опису типів даних та визначення змінних транслятор відводить кожній змінній відповідну кількість ділянок пам’яті та закріплює їх за кожною змінною на весь час роботи програмного блоку. Навіть якщо змінна більше не потрібна, пам’ять не може бути використана. Тому такі дані мають назву статичних.
Однак багато задач потребують більш складних інформаційних структур. Для таких задач характерно, що їх структури даних змінюються під час виконання програми. Такі структури даних мають назву динамічних структур.
До динамічних структур належать:
– стекові структури;
– однозв’яні та двозв’язні списки;
– бiнарнi дерева і т.i.
Для програмної підтримки усіх цих структур можна застосовувати масиви, але при цоьму або необхідно описувати занадто великі масиви з відомою надлишковістю, або, у випадку визначення свідомо малих масивів, можливість застосування програми буде обмежена.
Альтернативою масивам є вказівники. Їх перевага полягає у тому, що:
– вони дозволяють створювати динамічні структури необхідної розмірності;
– програмiст отримує можливості оперувати великими об’єктами за допомогою 4-байтних вказівників;
Перше ніж ми перейдемо до знайомства з динамічними структурами, розглянемо, що з себе уявляють динамічні об’єкти.