Gilberg: Тогда действуйте через икосаэдр, как я написал. Вам в любом случае понадобится не менее 12 кругов, у которых только 5 соседей - так пусть они будут расположены симметрично.
Сначала опишите, что значит "не работает". Он не компилируется? Выдаёт ошибку при запуске? Зависает? Или выдаёт неправильный результат?
Пока могу сказать, что это не может быть "чистым С". Вероятно, это какая-нибудь современная версия С++.
Виталий Пухов: Может быть, и будет. Я не уверен, к чему приведёт изменение последнего байта буфера destPtr в случае ширины, не кратной 4 - не появится ли справа от скопированного участка цветная каёмка. Лучше, всё-таки, копировать столько байт, сколько надо (для формата rgb24bpp - 3*srcBitmap.Width).
Простейший вариант: берёте любой элемент. Сортируете остальные по расстоянию до него (расстояние считается как max(abs(x1-x2)/max_dx,abs(y1-y2)/max_dy) ). Просматриваете элементы по порядку, и смотрите, какие можно добавить в группу, исходно состоящую из выбранного элемента. Когда таких не осталось - первая группа сформирована, выдаёте её и исключаете попавшие в неё элементы из массива. Повторяете, пока массив не кончился.
Можно начать с пары элементов, расстояние между которыми минимально. Тогда будет больше шансов на плотные группы.
asd111: Не забывайте, что если вы пишете на С, то вам будет необходимо иметь правильную версию C-библиотеки, а она тоже занимает место (и в какой-нибудь Embedded XP её может сразу не оказаться). Либо использовать статическую линковку, что очень резко увеличит размер кода. Системные вызовы в этом смысле экономнее. Судя по кодам для Linux, у них есть команда syscall (тоже какое-то прерывание?), которая позволяет написать совсем короткую программу. Про ELF-файл пока не скажу, с исполняемыми файлами для Linux мне разбираться пока не пришлось.
Plant: Точкам на границе приписать значение W=0. Потом для каждой точки Q, лежащей в квадрате 7*7 от уже подсчитанной точки P посчитать W(P)+dist(P,Q), и если оно меньше текущего W(Q), то заменить W(Q) на W(P)+dist(P,Q). Лучше всего делать это с помощью приоритетной очереди - перебирать точки P с наименьшим подсчитанным значением - тогда менять значение уже подсчитанной точки не придётся (примерно как алгоритм Дейкстры, но с большим числом стартовых вершин). Тогда значение точки - приближённое расстояние от неё до края, а точка с наибольшим значением - искомая.
asd111: Я так понял, что вопрос - как написать программу полностью. Желательно, в 16-ричном редакторе. Любая программа, использующая C/C++ займёт огромный объём, без ошибок вручную его не сгенерируешь и не введёшь. Для com-файла в MSDOS такие трюки были вполне реальны, но как это сделать в современных операционных системах?
Во времена MSDOS было бы понятно - int 21h, и вывод на консоль в кармане. Можно даже структуры exe-файла не знать, писать сразу в com. А сейчас что делать? Поможет ли ассемблер?
Cyrax2014: Способность-то есть всегда. Ведь разум - это и есть способность человека ориентироваться в нестандартных ситуациях и находить решения задач, с которыми раньше не встречался. Но расстояние от знакомых задач до незнакомых, которые человек сможет решить, может слегка различаться для разных людей. Не думаю, что его можно увеличить. Основной способ повысить шансы на решение нестандартных задач - увеличить количество стандартных, чтобы уменьшить расстояние.
Часть подготовки к математическим олимпиадам высокого уровня - решать по 50 задач в день. Как раз чтобы набрать базу.
Виктор: Если двойная ошибка произошла в двух битах одного столбца, то вы узнаете, в каких строках она была, но не узнаете, в каком столбце: ведь в нём контрольная сумма в порядке.
Да, записываем в 25-й бит сумму 16 рабочих битов (или контрольную сумму сумм по строкам - что то же самое). Получаем табличку, в которой сумма в каждой строке и каждом столбце нулевая. Если произойдёт одна ошибка - то нарушатся одна строка и один столбец (и мы сможем её исправить), если две - то нарушатся две строки и/или два столбца.
Андрей: Согласен. В вашем варианте ситуация "строка испортилась, а столбцы - нет" означает, что испортился контрольный бит в строке - значит, последний бит действительно ни к чему. Разве что, попробовать с его помощью детектировать двойные ошибки?
Армянское Радио: При целых весах задача о рюкзаке решается за O(N*S), где S - объём рюкзака. Правда, при ограничении S < 10^9, N < 10^5 это мало спасает.