Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмдеу жане багдарламалау негиздери 4 г.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
2.73 Mб
Скачать

Тақырыбы: Рекурсивті алгоритмдердің таралымы. Лабиринт есебі.

Тапсырмалар:

«Семь лунок». Вдоль доски расположено 7 лунок, в которых лежат 3 черных и 3 белых шара так, как по­казано на рис. 1. Передвинуть черные шары на место белых, а белые;—на место черных. Шар можно передви­нуть либо в соседнюю с ним пустую лунку, либо в пустую лунку, находящуюся непосредственно за ближайшим шаром.

«Прыгающие шарики». Эта игра похожа на пре­дыдущую. Исходная позиция—8 лунок, в которых рас­ставлены 4 черных и 3 белых шара (рис. 2). Поменять местами черные и белые шары. В отличие от предыдущей игры черные шары можно передвигать только вправо, а белые только влево.

Вдоль доски расположены лунки и в каждой лунке лежит шар черного или белого цвета (пример приведен на рис3. а). Одним ходом раз­решается менять местами два любых шара. Добиться того, чтобы сначала шли белые шары, а за ними – черные (рис 3, б). Если общее число лунок равно n, то для решения задачи достаточно сделать не более [n/2] ходов.

4. Пусть теперь, в отличии предыдущей задачи, в каждой лунке лежит красный, белый или синий шар. Одним ходом разрешается менять местами два любых шара. Добиться того, чтобы все красные шары шли первыми, все синие— последними, а белые - посередине. Это вариант «задачи о голландском флаге» (поле голландского флага разделено на три полосы – синюю, белую, красную). Если общее число лунок равно n, то достаточно сделать не более n-1 хода.

5.Задача о лабиринте. Прямоугольное клеточное поле ограничено пре­пятствиями. Кроме того, на поле задается произвольная система препятствий, на­чальная клетка, на которой находится Черепашка, и конечная клетка. Найти марш­рут выхода из лабиринта, если он существует, и пронумеровать клетки маршрута в том порядке, в котором проходит их Черепашка. Черепашка может делать шаг на одну клетку в любом из четырех направлений: влево, вправо, вверх, вниз.

әдебиет:

1.Негізгі – 3, 5, 9-12

2. Қосымша - 4

Әдістемелік нұсқау:

В Тапсырмаларх с 1 по 4 рассматриваются программы, основ­ное назначение которых—поддержка необходимой игровой обстановки. Играющему предлагается исходная ситуация порождаемая, как правило, с помощью датчика случайных чисел, все его ходы контролируются: если ход сделан по правилам игры, ситуация изменяется. В зада­чах смена игровой ситуации означает смену по­ложений цветных шаров на игровой доске. В противном случае выдается соответствующее сообщение, ситуация остается неизменной. Программа также обязана отслежи­вать достижение целевой ситуации.

Решение Тапсырмалар №5

Структуры данных. Клеточное поле размером N x M опишем двумер­ным массивом А размерности N + 2, М + 2. При этом будем считать, что

A[I, j] = 0, если клетка [i, j] свободна и не посещалась Черепашкой;

A[I, j]=-1, если клетка [i, j] является клеткой, на которой находится пре­пятствие, или находится за пределами лабиринта.

Координаты входа — i1,j1, координаты выхода — i2,j2. Они задаются пользо­вателем. Блок Тапсырмалар исходных данных в программе и вывод массива Z доста­точно просты, поэтому остановимся на разборе основной логики. Черепашка, перемещаясь по свободным клеткам (A[i,j] = 0), должна найти клетку выхода (A[i2,j2] = 0), запоминая при этом свой путь, и после нахождения отметить свой путь числами, то есть в каждую клетку пути записать номер шага, на котором она проходит эту клетку.

Предположим, что Черепашка находится в клетке a[i,j]. Из этой клетки она может сделать либо шаг на север, либо шаг на восток, либо шаг на запад, либо шаг на юг, если соответствующее направление не закрыто препятствием. Пусть Черепашка осуществляет поиск свободного поля для выполнения хода в следую­щем порядке:

 - соответствует уменьшению координаты i (Dec(i));

-соответствует уменьшению координаты j (Dec(j));

- соответствует увеличению координаты j (Inс(j));

- соответствует увеличению координаты i (Inс (i)).

Рассмотрим процесс поиска прохода на примере. Пусть в представленном выше лабиринте Черепашка должна найти проход из клетки с координатами i1 = 1, j1 = 3 в клетку с координатами i2 = 6, j2 = 1. Первый шаг делается в начальную клетку, то есть a[1,3]:=1. Из начальной клетки она может сделать шаг только в направле­нии 4 (inc(i)), так как в направлении 1, 2 произойдет выход за пределы лабиринта, в направлении 3 Черепашка наткнется на препятствие. Следовательно, надо присво­ить а[3, 2] значение 2 (шаг сделан). Далее снова производится анализ направлений хода в том же порядке: направление 1 отбрасывается, так как приводит к возврату, направления 2, 3 тоже отбрасываются, так как там препятствия. Черепашка должна сделать ход вновь в четвертом направлении: а[3, 3]:= 3. Четвертый шаг можно сде­лать в направлении 3 и 4. Пусть Черепашка всегда выбирает первый из всех допусти­мых вариантов, в данном случае 3 (): а [3, 4] := 4. Это тупик — с трех сторон клетка с координатами 4, 5 окружена препятствиями. Следовательно, надо вернуться на один шаг назад и попытаться по-другому сделать четвертый шаг. Из предыдущей клетки можно шагнуть еще и в четвертом направлении, то есть а [4, 3]:=4. Затем вновь делается шаг в четвертом направлении, единственно возможном (а[5, 3]:=5). И так далее до тех пор, пока Черепашка не доберется до конечной клетки.

Таким образом, при анализе вариантов очередного хода Черепашке необходи­мо проверить, свободна ли рассматриваемая клетка. В этом случае a[i,j] = 0. Ход делать нельзя в клетку, для которой a[i,j] = -1 (выход за границы лабиринта, вклетке препятствие), или а[i, j] > 0 (ход назад). При выполнении 1-го хода в клетку с координатами i, j надо a[i, j] присвоить значение 1.

Если Черепашка зашла в тупик (в трех направлениях препятствия или границы лабиринта), то она должна попытаться сделать новый вариант прохода. Для этого ей надо вернуться на один шаг назад и проверить оставшиеся варианты из преды­дущей позиции. При этом необходимо «занулить» значение a[i, j].

Выбор варианта хода осуществляется из четырех возможных вариантов. В масси­вах b и с, содержащих по 4 элемента, будем хранить приращения к значениям текущих координат, в сумме с которыми они дают возможные координаты нового хода Черепашки:

b:Array[l..4] Of Integer=(-1,0,0,1);

c:Array[l..4] Of Integer= (0,-1,1,0);

Тогда выбор хода и проверку его возможности можно организовать с помощью цикла

For k:=l To 4 Do

If a[i+b[k],j+c[k]]=0 Then...

Опишем этот процесс в виде рекурсивной процедуры Move(i,j, I:Integer), вход­ными параметрами которой являются значения текущих координат Черепашки i, j и l — номер ее очередного шага. Если текущие значения координат совпадут с заданными конечными значениями i2, J2, то необходимо вывести лабиринт с от­меченным проходом Черепашки и закончить работу. Вывод осуществляется проце­дурой Print(a:my array).

Если прохода из заданной начальной клетки в заданную конечную клетку не существует, то необходимо вывести информацию об этом на экран. В этом случае, после того как Черепашка проверит все возможные способы прохода, и необходи­мый результат не будет получен, значение a[i2, j2] по-прежнему будет равно 0.

Program Example;

Uses Crt;

Const n=5; m=6; {размеры поля}

b:Array[l..4] Of Integer= (-1,0,0,1);

c:Array[1..4] Of Integer=(0,-1,1,0);

Type myarray=Array [0..n+1,0..m+1] Of Integer;

Var a: myarray; {исходный лабиринт} i, j, il,i2,jl,j2 : Integer;

Procedure Init; {формирование массива а из файла}

Var i, j, t: Integer; f: text;

Begin

Assign(f,'c:\l.dat'); Reset(f);

For i:=0 To n+1 Do For j:=0 To m+1 Do a[i,j]:=-l;

For i:=l to n Do For j:=l To m Do Read(f,a [i,j]) ;

Close(f) ;

End;

Procedure Print(a: myarray); {печать лабиринта}

Var i, j: integer;

Begin

For i:=l To n Do

Begin

For j :=1 To m Do

Case a[i,j] Of

-1: Write(‘*') ;

0 : Write ( ' ' ) ;

Else Write (a[i, j] :3) ;

End;

Writeln;

End;

End;

procedure Move (i, j, 1: Integer);

Var k: Integer;

Begin

(i=i2) And (J=J2) Then {достигнута конечная клетка}

Begin print (a); exit End

Else

Begin

Fok-l To 4 Do {выбор направления хода}

If a[i+b[k], j+c[k]]=0 Then {шаг сделать можно}

Begin

a[i+b[k],j+c[k]]:=l; {сделать шаг}

hod(i+b[k],j+c[k],l+1);

a[i+b[k],j+c[k]]:=0; {возврат на 1 шаг назад}

End;

End;

End;

Begin

Clrscr; Writeln ( ' ДАННЫЙ ЛАБИРИНТ : ' ) ;

Writeln(‘___________________'); Init; Print (a);

Writeln(‘ВВЕДИТЕ КООРДИНАТЫ ВХОДА’); Readln(il, jl);

Writeln ( ' ВВЕДИТЕ КООРДИНАТЫ ВЫХОДА ' ) ; Readln ( i2 , j 2 );

A[i1,j1]:=1;

{первый шаг в начальную клетку с координатами il, jl}

Move(i1,j1,2);

If a[i2, j2]=0 Then Writeln(‘ПРОХОД НЕВОЗМОЖЕН');

Readln;

End.

39-40 жұмыс