- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование игр и головоломок - Жак Арсак
Шрифт:
Интервал:
Закладка:
Бесспорной выглядит трудность, связанная с тем, что одна и та же буква может встречаться во второй цепочке несколько раз. Их нужно рассмотреть все, но их нельзя смешивать между собой. Я уверен, что это вас надолго не задержит.
Больше я вам ничего не сообщаю. Ищите дальше сами…
Головоломка 37.
Вы можете рассмотреть задачу самым простым способом. Пусть задан прямоугольник — координатами x1, y1 и x2, y2 верхней левой и нижней правой вершины соответственно. Мы выясняем, является ли этот прямоугольник белым (нет ли внутри черной клетки), и если да, то измеряем его площадь.
Мы проделываем это для x1, y1, пробегающих все игровое поле, а x2, y2 должны удовлетворять неравенствам x2 ≥ x1, y2 ≥ y1 и пробегать часть игрового поля, удовлетворяющую этим неравенствам.
Так как для каждого прямоугольника вы должны пробежать его по всей его площади целиком, то порядок роста программы есть n4. Но вы можете улучшить программу уже здесь, не рассматривая такие точки x1, y1, которые не могут дать площади прямоугольника, превосходящей уже найденный максимум (это — близкие к правому краю или к нижнему краю точки игрового поля).
Вы можете сделать еще лучше, задав лучшую информацию. Предположим, например, что у вас есть вектор размерности n, — скажем вектор l такой, что l[i] есть число последовательных белых полей на строке i, начиная со столбца l. Тогда вы можете легко найти площади белых прямоугольников, одна из вершин которых находится в точке x1 = j, y1 = i. Нисколько не более трудно перейти и от вектора l для столбца j к вектору, связанному со столбцом j + 1.
Этих указаний должно быть достаточно для того, чтобы вы сумели получить хороший алгоритм.
Головоломка 38.
Очевидно, что мы очень многого не знаем. Следовательно, нужно тщательно прочесть условие и выделить все данные. Невозможно, чтобы на каждый вопрос решительно все ученики ответили неправильно, потому что если бы это случилось, то они все получили бы 0. Следовательно, на каждый из вопросов есть правильный ответ, который либо является одним из чисел, входящих в ответы учеников, либо другим числом (и тогда более или менее все равно каким).
Таким образом, правильный ответ на первый вопрос может быть одним из чисел
8 12 16 20 и другим числом, скажем 24,
чтобы ответы образовывали арифметическую прогрессию с разностью 4. Сделаем то же самое для других вопросов. Таким образом, вы получите, например:
R1: 8 12 16 20 24
R2: 12 14 16 18
RЗ: 10 12 14
R4: 16 18 20 22 24
Исследуем все полученные из оценок четверки чисел, отводя по строчке для каждой из них. Они образуют 5*4*3*5 = 300 строк. Для каждой из них ваша программа смотрит, сколько учеников получило 0, и запоминает только те четверки чисел, для которых один и только один ученик получил 0 (это дано в условии). Заметьте к тому же, что вам сообщено, что ответом на один из вопросов должна быть площадь поверхности куба с целым ребром, следовательно, число вида 6n2, возможные значения которого 6, 24… Ни один из ответов не имеет вида 6n2 с целым n. Следовательно, мы должны получить, что в выделенных четверках есть одна или несколько четверок, у которых хотя бы одна компонента имеет значение, не предложенное ни одним из учеников. Ваша программа легко их найдет (такой набор в точности один). На этом основании мы узнаем правильность всех ответов на вопросы, остальное просто.
При всем том, это — головоломка для начинающих…
Головоломка 39.
Эта головоломка сопротивлялась мне много дней и была для меня очень поучительной. В условии сказано, что эта программа должна выполняться за время вычисления, пропорциональное n. Следовательно, и речи нет о том, чтобы исследовать все суммы подпоследовательностей вектора, чтобы выбрать из них наилучшую. Нужно исхитриться. Так же, как мы здесь уже упоминали, ответ может состоять в получении свойств подпоследовательности с максимальной суммой.
Я совершил ошибку, пойдя по этому пути. Я сказал себе: назовем S(i, j) сумму элементов вектора с номерами от i до j:
S(i, j) = ai + ai+1 + … + aj−1 + aj.
Если для некоторой пары i, j эта сумма максимальна, то отсюда следует
S(i, j) > S(i + 1, j)
и, следовательно, ai > 0. Точно так же ai + ai+1 > 0.
Если обобщить любое «начало» (левая часть) S(i, j) положительно, и точно так же любой «конец» положителен. Можно продолжать:
ai−1 отрицателен…
И я таким образом не получил ничего. Это не означает утверждения, что на этом пути нельзя найти решения. Это я его не нашел.
Как я уже говорил, вы можете обратиться к математике за помощью в решении вашей задачи по информатике[28]. Но у информатики есть и свой собственный творческий дух. Почему бы ему не довериться? Эта задача сбивает вас с толку по причине ограничений на сложность алгоритма. Забудем их. Если вам сказано, что нужно решить задачу, и вам предоставлена свобода вплоть до максимальной сложности, что вы будете делать? Вы составите таблицу S (i, j) для i = 1, …, n и j = i, …, n. В этой таблице вы возьмете максимальный элемент.
Чтобы помочь вам, я предлагаю вам рассмотреть следующий вектор:
3 4 −8 2 −3 7 5 −6 1
Образуйте треугольную таблицу чисел S (i, j) и запишите ее. Посмотрите, как каждая строчка образуется из предыдущей. Вы увидите, что только три строчки могут содержать максимальное S и, кроме того, не во всей их полной длине. В этом примере максимум нужно искать среди
(1, 1 : 3), (4, 4 : 5), (6, 6 : 9).
Следовательно, есть в точности n значений S, которые нужно рассматривать. Таким способом вы и получаете алгоритм, линейный по n.
Закончить предоставляю вам.
Часть III. И если вы все еще не нашли решения
Многие игры или головоломки уже не требуют никаких дополнительных пояснений. Но некоторые из них еще могут вам сопротивляться. Поэтому следует сказать вам все…
1. Случайные числа
Головоломка 1.
Первая стратегия. Нужно сравнить u2i и ui. Они равны, если 2i = i + kp для целого k, следовательно, если i делится на p. Кроме того, i должно превосходить r. Следовательно, нужно искать наименьшее кратное p, большее или равное r.
Положим vi = u2i. Тогда
vi+1 = u2i+2 = f(f(u2i)) = f(f(vi)).
Если вы начинаете u с u1 = a, то вы начинаете v с v1 = f(а).
Таким образом, получаем начало программы:
u := a; v := f(а)
ПОКА u ≠ v ВЫПОЛНЯТЬ
u := f(u); v := f(f(v))
ВЕРНУТЬСЯ
Теперь вы получили два равных элемента. Чтобы получить период, нужно пройти интервал между полученными числами — например, начиная с u — считая число элементов:
p := 1; w := f(u)
ПОКА w ≠ u ВЫПОЛНЯТЬ
w := f(w); p := p + 1
ВЕРНУТЬСЯ
Мне пришлось рассказать вам все…
Вторая стратегия. Начните с d = 1 и h = 1. Если вы не находите периодичности в интервале от d + 1 до d + h (сравнивая u на этом интервале со значением u на элементе d, сохраняемым в некоторой переменной, например, x), возьмите значение u в d + h в качестве нового значения x, d + h в качестве нового d, и удвойте k.

