Цитата:
Сообщение от EvroStandart
Ты неправильно понял. Я написал Нужно составить алгоритм, который заполняет кроссворд числами из списка. Условие: чтобы сумма цифр из всех квадратов в кроссворде получилась максимальная.
То есть вписали число 3465, считаем: 3+4+6+5. В кроссворд надо добавлять как слова: если число из трёх цифр, то оно займёт три квадрата. Потом считать сумму всех квадратов. Получившийся алгоритм для заполнения должен работать со словами тоже (может быть при минимальном изменении).
Меня больше всего интересует как сделать перересечение линий в кроссворде. Если в одной линии я вписал 2 7 9 4 2 5, предположим цифра 4 попала на пересечение. Тогда нужно както вычислить, что по другой линии одна цифра уже есть. Соответственно туда надо искать число соответствующее условию.
|
Опять же я бы использовал для этих целей преобразование числа в строку - длина строки=количество клеток. Тогда ты легко можешь работать как со строками так и с цифрами. Единственное - возникнут накладные расходы на преобразование цифры в строку и обратно - но не настолько уж большие. Используя предложеную связку контейнеров ты можешь легко определить наличие или отсутствие букв в строке пересечения - все что для этого тебе необходимо - написать шаблон функции поиска которая возвращает количество элементов имеющих У (или Х смотря какое пересечение) одинаковый с искомой позицией (блин как завернул) и валюе которых не пусто или в противном случае ноль. Но при этом важно не забыть проверять на наличие разрывов между ячейками. Кстати, я немного не сообразил вчера, для связки нужно использовать не 3 а 2 контейнера - в одной хранится уникальный идентификатор ячейки и итератор на элемент второго контейнера. А во втором хранится структура, полями которой являются - ид, Х,У, признак первой или последней ячейки и значение. Так же здесь может хранится идентификатор следующей и предыдущей ячейки по вертикали, горизонтали и верхней нижней. Можно использовать и просто массив - но у контейнера есть преимущество - стандартная библиотека функций. Можно использовать и один контейнер - но это решение мне нравится меньше.
То есть в первом приближении алгоритм выглядит так:
1. Шаг первый - инициализируешь сетку кроссворда - т.е. заполняешь массивы структурами с установленным значением Х и У и присваеваешь им уникальный идентификатор.
2. Получаешь длину строки которую необходимо заполнить.
3. Находишь число совпадающее с длиной строки.
4. Раскладываешь его на составляющие и получаешь сумму.
5. Проверяешь на соответствие условиям.
6. Помещаешь в ячейки.
7.Повторяешь со 2 до тех пор пока не дойдешь до последней ячейки.