Risent Veber: если вся структура лабиринта заранее неизвестна - то его лучше обходить с помощью обхода в ширину - он гарантирует нахождение самого оптимального пути и сам является оптимальным. Для использования с монетками можно попробовать манипулировать с длинами ребер, ведущим к ним, при инициализации графа.
Более оптимальным кажется подход с последовательным использованием алгоритмов A* и B*: отправной точкой является старт, а целями монетки, при этом, после нахождения каждой монетки, алгоритм запускается заново, используя в качестве старта позицию последней найденной монеты.
artshelom: Разбить один большой список на несколько маленьких (хотя бы по ~20-30 элементов) и обрабатывать каждый, не забывая убивать потоки после каждой обработки
Tsiren Naimanov: если поможет - для этого есть целый проект на гитхабе. Помимо этого гугл выдаст сотню других по запросу "c# phash", так что проблем возникнуть не должно
upd: На ночь глядя не заметил, что алгоритм не будет работать в 100% случаев, так как удаляемое ребро может принадлежать нескольким путям сразу.
Вместо поиска кратчайших и удаления ребер стоит искать сразу все пути поиском в ширину, обработка же их для нахождения остается такой же
Роман: готовые библиотеки хранятся в папке Release, остается только подключить
Еще где-то был фронтенд для него (под юниксы - точно), можно поискать, если интересно
Йцу Йцуевич: предполагается, что за один шаг инвертируется только одна скобка, как в примере из вопроса. Проверка, соответственно, производится только после второй инверсии (после первой она гарантировано неправильна).
Пример из комментария алгоритмом можно обработать, если разбить его на шаги (но тогда она будет производиться более одного раза, асимптотика испортится). Проверка же после произвольного числа инверсий невозможна за асимптотику меньшую, чем O(n). В лучшем случае можно отсеить за константное время часть случаев, но это и все
Денис: Так как API находится на домене с SSL, то (подозреваю), id и secret передается в заголовке https? Если так, то можно считать, что безопасно на всем пути передачи до клиентской машины, так как все заголовки шифруются.
Просто нужно знать, почему именно и в каких случая передавать безопасно, а в каких нет. Из формулировки вопроса следует, что интересует именно применение base64 в контексте безопасности. Так вот, на безопасность он никак не влияет, так как является средством представления (кодирования) информации, но не средством защиты. Что, в общем-то, не отменяет того факта, что передача может быть безопасна по ДРУГИМ причинам.
У "среднего" C++ программиста памяти расход может быть даже выше, как раз за счет проблем выделения и контроля памяти (напрямую зависит от степени кривизны рук). Тут уж от случая к случаю, обобщать смысла мало
Более оптимальным кажется подход с последовательным использованием алгоритмов A* и B*: отправной точкой является старт, а целями монетки, при этом, после нахождения каждой монетки, алгоритм запускается заново, используя в качестве старта позицию последней найденной монеты.