Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных / методичка структуры данных_задания.docx
Скачиваний:
54
Добавлен:
12.05.2015
Размер:
381.84 Кб
Скачать

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-байтних вказівників;

Перше ніж ми перейдемо до знайомства з динамічними структурами, розглянемо, що з себе уявляють динамічні об’єк­ти.