Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Абрамов С.А., Гнездилова Г.Г., Капустина Е.Н., Селюн М.И. Задачи по программированию [pdf]

.pdf
Скачиваний:
736
Добавлен:
02.05.2014
Размер:
6.04 Mб
Скачать

1038. Имеется n городов. Некоторые из них соединены дорогами известной длины. Вся система дорог задана квадратной матрицей порядка n, элемент ai j которой равен некоторому отрицательному числу, если город i не соединен напрямую дорогой с городом j и равен длине дороги в противном случае (i, j = 1, ..., n).

а) Для 1-го города найти кратчайшие маршруты в остальные города.

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

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

1040. Найти такую расстановку двенадцати коней на шахматной доске, при которой каждое поле будет находиться под ударом одного из них.

1041. Найти такую расстановку восьми слонов на шахматной доске, при которой каждое поле будет находиться под ударом одного из них.

1042. В данной последовательности действительных чисел

a1 , ..., a20 выбрать возрастающую подпоследовательность наибольшей длины.

1043. Построить все правильные скобочные выражения (см. задачу 1027) длины 10, т.е. те, которые содержат по5 левых и по 5 правых круглых скобок.

1044. Имеется n предметов, веса которых равны a1 , ..., an .

Разделить эти предметы на две группы так, чтобы общие веса двух

групп были максимально близки.

1045. Получить последовательность a1 , ..., an цифр 0, 1, 2, в

которой нет смежных одинаковых участков (например, последовательность 2, 0, 1, 1, ... не годится, так как рядом расположены два одинаковых члена 1; последовательность 2, 1, 0, 1, 2, 1, 0, 1, так как рядом расположены два одинаковых участка 2, 1, 0, 1 и т.д.).

1046. «Задача о рюкзаке». Имеется т различных предметов, известны вес каждого предмета и его стоимость. Определить, какие предметы надо положить в рюкзак, чтобы общий вес не превышал заданной границы, а общая стоимость была максимальна. Решить эту задачу для т предметов, веса которых в килограммах равны p1 , ..., pm ,

стоимости - c1 , ..., cm . Вес рюкзака не должен превышать 50кг.

§ 36. Некоторые приемы программирования*)

*) Задачи этого раздела предназначены тем, кто хочет дополнительно овладеть некоторыми приемами, которые используются в современном программировании не менее широко, чем, скажем, вложенные циклы. Это приемы работы с развитыми информационными структурами: линейными списками и деревьями, а также приемы управления динамической памятью.

1047. При программировании практических задач часто приходится работать с различными списками. Примерами могут служить список учеников 9а класса, список учителей, преподающих литературу во всех 10-х классах школы, список участников спортивной игры и т. п. Каждый элемент списка содержит, как правило, несколько полей. Например, элементы списка выпускников школы могут включать имя и фамилию ученика, а также его средний балл по аттестату.

Представление списков в памяти ЭВМ может быть основано на последовательном и на связанном распределении памяти. При последовательном распределении элементы списка (будем также называть их узлами) размещаются последовательно, один за другим. При связанном распределении памяти местоположение каждого элемента заранее неизвестно - блок памяти, который отводится для размещения отдельного элемента, выделяется из одной большей области памяти по специальным алгоритмам (см. задачу 1052). Поэтому все узлы содержат по крайней мере одно дополнительное поле - поле связи со следующим (рис. 120, а) или предыдущим узлом (рис. 120, б) (см. также задачи 531 и 532).

На рис.120 FIRST - это переменная, указывающая на первый узел в списке; LAST - переменная, указывающая на последний узел в списке; стрелки обозначают связи между узлами; NIL - значение поля

связи, говорящее о том, что данный узел не связан ни с каким другим узлом (является последним на рис. 120, а и первым на рис. 120, б).

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

Наиболее часто используются следующие виды связанного распределения памяти (далее, под термином список мы будем понимать конкретное представление соответствующей информационной структуры в памяти ЭВМ на основе связанного распределения памяти):

1) Односвязные списки, в которых каждый элемент содержит поле связи либо со следующим, либо с предыдущим элементом списка

(рис. 120).

FIRST

. . .

NIL

 

а

 

NIL

. . .

LAST

 

б

Рис. 120

2) Односвязные циклические списки, в которых последний элемент содержит поле связи с первым элементом (рис. 121) (см. задачу 545).

Рис. 121

3) Двусвязные списки, в которых каждый элемент содержит поле связи со следующим элементом и с предыдущим (рис. 122) (см. задачу 533).

FIRST

NIL

NIL

 

Рис. 122

При работе с линейными списками требуется, как правило, выполнять следующие операции [34]:

1) Получить доступ к k-му узлу списка, чтобы проанализировать и/или изменить содержимое его полей.

2)Включить новый узел непосредственно перед k-м узлом.

3)Исключить k-й узел.

4)Объединить два (или более) списка в один список.

5)Разбить список на два (или более) списка.

6)Сделать копию списка.

7)Определить число узлов в списке.

8)Выполнить сортировку узлов списка по значениям некоторых

полей.

9) Найти в списке узел с заданным значением некоторого поля. Составить процедуры, реализующие перечисленные выше

операции 1) - 9) для работы с односвязными, односвязными циклическими и двусвязными списками.

1048. Одним из наиболее часто встречающихся видов списка является стек-список, в котором все включения и исключения элементов делаются только на одном его конце -вершине стека (рис. 123). Механизм функционирования стека хорошо отражен в другом его названии - список типа «LIFO» (last in first out) - «последним вошел - первым вышел»).

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

Составить процедуры, реализующие операции занесения

элемента в стек и удаления элемента из его вершины.

Вершина

стека

M

Низ

стека

Рис. 123