Смекни!
smekni.com

Разработка системы задач (алгоритмы-программы) по дискретной математике (стр. 4 из 6)


В двумерном массиве Aplace[1..n,1..m] для каждого робота значениями, равными единице, будем указывать те населенные пункты, в которых данный робот может находиться в данный момент времени. Поясним логику решения на примере. Четыре робота находятся в пунктах 1,2,7,8.

Alink Aplace

1 2 3 4 5 6 7 8 1 2 3 4
1 0 1 1 0 0 0 0 0 1 1 0 0 0
2 1 0 1 0 0 0 0 0 2 0 1 0 0
3 1 1 0 1 1 0 0 0 3 0 0 0 0
4 0 0 1 0 0 1 0 0 4 0 0 0 0
5 0 0 1 0 0 1 0 0 5 0 0 0 0
6 0 0 0 1 1 0 1 1 6 0 0 0 0
7 0 0 0 0 0 1 0 0 7 0 0 1 0
8 0 0 0 0 0 1 0 0 8 0 0 0 1

Первый робот может остаться в первом пункте или пойти во второй или третий пункты, в соответствии со связями в матрице Alink. Таким образом, в первом столбце матрицы Aplace во второй и третьей строках вместо 0 должны появиться 1. Изменения матрицы Aplace для роботов с номерами 2, 3 и 4 выполняются аналогичным образом.

Aplace через 1 момент времени Aplace в следующий момент времени

1 2 3 4
1 1 1 0 0
2 1 1 0 0
3 1 1 0 0
4 0 0 0 0
5 0 0 0 0
6 0 0 1 1
7 0 0 1 0
8 0 0 0 1
1 2 3 4
1 1 1 0 0
2 1 1 0 0
3 1 1 1 1
4 1 1 1 1
5 0 0 1 1
6 0 0 1 1
7 0 0 1 1
8 0 0 1 1

Итак, появилась строка или строки матрицы Aplace, состоящие из одних единиц. Эта строка будет соответствовать населенному пункту, в котором возможна встреча роботов.

Однако для пунктов

И при начальном расположении двух роботов в пунктах 1 и 6 встреча роботов никогда не произойдет, и строки Aplace, состоящей из одних единиц, не появится. Это требует введения второй матрицы (Aold), в которой должны фиксироваться достижимые пункты для каждого робота в предыдущий момент времени. Итак, если Aplace и Aold совпадают и нет ни одной строки, состоящей из одних единиц, то встреча роботов невозможна. Это схема решения первого задания. Решение второго задания отличается от первого тем, что требуется найти время Т2=Т1 – 1 (Т1 – время встречи роботов в одном населенном пункте), в которое все роботы находятся в одном из двух (произвольных) населенных пунктов, соединенных дорогой. В этом случае возможна их встреча и вне населенного пункта. Другими словами, в каждый момент времени необходимо проверять (находить) две строки матрицы Aplace, поэлементная логическая сумма которых дает строку, состоящую из одних единиц. При решении задания три матрицу Aplace следует не дополнять элементами, равными единице, а обновлять в соответствии со связями из матрицы Alink. Причем обновление выполнять не для всех роботов одновременно: в нечетные моменты времени 1,3,… для роботов, имеющих скорость 2, а в четные – 2, 4, …для всех роботов.

(Текст программы см. Приложение 7)

Вожатый в лагере. У вожатого в отряде дети разных возрастов от 10 до 17. каждое утро дети выходят на линейку, где они должны построится по старшинству (сначала старшие, затем младшие), но на первой линейке дети этого не знали и построились в произвольном порядке. Вожатый составил список возрастов построившихся. Необходимо составить алгоритм – программу, которая бы помогла вожатому как можно быстрее выстроить детей по старшинству.

Решение. Входные данные представляют собой список возрастов, который считывается из файла. Пример:

13 10 15 17 14 16 12 11

Выходные данные для данного примера:

17 16 15 14 13 12 11 10

Идея решения: задача решается с использованием методов сортировки. Так как в задаче указано, что необходимо выстроить детей как можно быстрее, то необходимо применить один из методов быстрой сортировки, например метод Хоара, эффективность данного алгоритма, по Д. Кнуту, составляет С=О(N*logN). Для некоторых исходных данных время сортировки пропорционально О(N2). (Текст программы см. Приложение 8)

Егерь. У егеря в лесном хозяйстве 4 станции, уезжая в командировку, он оставил своему молодому напарнику, подробную карту, на которой изображены все дороги из одной станции в другую. В качестве приложения он оставил таблицу, в которую занес время, которое понадобиться напарнику, чтобы добраться из одной станции в другую, таблица имеет следующий вид:

1 2 3 4
1 0 60 5 5
2 2 0 7 60
3 6 5 0 2
4 3 60 5 0

Где номер строки, это номер станции из которой напарник должен выйти, а номер столбца – это номер станции, в которую он должен попасть. Необходимо написать алгоритм-программу, которая укажет станции, через которые напарнику придется пройти, чтобы очутиться в нужной станции за минимальное время. Начальная и конечная станции вводятся с клавиатуры.

Решение. Данную таблицу можно рассматривать как матрицу смежности и построить по ней граф, который наглядно отобразит схему дорог из одной станции в другую. Таким образом можно применить один из алгоритмов поиска кратчайших путей, в данном случае наиболее удобно использовать алгоритм Флойда, который позволит не только найти минимальное время, которое потребуется напарнику, но и сам путь. Временная сложность данного алгоритма пропорциональна О(N3).

(Текст программы см. Приложение 9)

Игра «Найди друга». Всем ребятам выдаются карточки с номерами, они выстраиваются в ряд, по возрастанию номеров. Ребенку, который водит, также выдается карточка с номером. Считается, что ребенок нашел друга, если номер на его карточке совпадает с номером человека, к которому он подходит. Написать алгоритм – программу, которая позволит ребенку найти друга так, чтобы ребенок подходил к минимальному количеству участников. В случае если невозможно найти друга программа выводит результат «No», если же это возможно, то программа должна выводить количество детей, к которым подходил «вожа».

Примечание: номера детей определяются с помощью датчика случайных чисел, а номер ребенка, который водит, вводится с клавиатуры.

Решение. Так как мы знаем, что ребята расположены по возрастанию номеров на карточке, то наиболее быстрый способ найти друга можно реализовать с помощью бинарного поиска.

(Текст программы см. Приложение 10)

Приложение.

1 Комнаты музея.

Uses crt;

Const n=100;

X:array[0..3]of -1..1=(0,-1,0,1); {массив координат перемещения по

Y:array[0..3]of -1..1=(-1,0,1,0); клеткам. Индекс элемента массива

Type Mas=array[0..n,0..n]of Integer; соответствует степени двойки}

var A:mas;

B:array[0..n,0..n]of Boolean;

m,p,col,rooms,indexX,indexY:integer;

procedure Init(Z:string); {заполнение из входного файла массива, представляющего цифровую карту музея}

Var f:text;

i,j:integer;

Begin

Assign(f,z);

Reset(f);

ReadLn(f,m,p);

For i:=1 to m do

begin

For j:=1 to p do

Read(f,A[i,j]);

ReadLn(f);

end;

FillChar(B,SizeOf(B),true);

For i:=1 to m do

For j:=1 to p do

B[i,j]:=false;

Close(f);

end;

function Degree2(i:integer):integer; {функция, вычисляющая i–ую степень двойки}

var j,t:integer;

begin

t:=1;

For j:=1 to i do

t:=t*2;

Degree2:=t;

end;

Procedure Solve(i,j:integer);

Var k:integer;

begin

k:=3;

While k>=0 do

begin

If A[i,j]<Degree2(k)then {смотрим имеет ли клетка стену в заданном направлении}

begin

If not B[i+X[k],j+Y[k]] then {определяем, заходили ли мы в клетку ранее}

begin

Inc(col); {учитываем клетку в общей площади комнаты}

B[i,j]:=true; {отмечаем, что в текущей клетке мы уже были}

Solve(i+X[k],j+Y[k]); {переходим в следующую клетку}

B[i,j]:=False; {делаем клетку, в которой последний раз были не просмотренной, чтобы рассмотреть другие варианты хода из неё в другую клетку}

end;

end

Else A[i,j]:=A[i,j]-Degree2(k);

Dec(k);

end;

end;

procedure Prosmotr; {данная процедура отмечает уже просмотренную комнату}

var i,j:integer;

begin

For i:=1 to m do

For j:=1 to p do

If A[i,j]=0 then B[i,j]:=True;

end;

begin

clrscr;

Init('A:museum.txt');

rooms:=0;

For indexX:=1 to m do {ищем ранее не просмотренную клетку}