• Как декодировать матрицу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    В комментариях мы выяснили, что была матрица 3x4 из цифр от 1 до 9. над ней произвели одно из трех действий и выдали результат. Надо по нему восстановить исходную матрицу. Надо решить на одной конкретной матрице.

    Надо попробовать применить все 3 метода и посмотреть, какой из них даст матрицу из цифр 1-9.

    Итак, для случаев "стороны включая элемент" и "стороны не включая элемент" можно восстановить исходную матрицу однозначно перебрав только первый столбец. Потому что посмотрите на любое число в первом столбце. Вы знаете изначальное число там (вы его перебрали) и знаете сумму известных чисел в столбце и числа справа (это вам дано в матрице). Отсюда можно найти число справа. Когда вы восстановили второй столбец, пройдитесь по всем клеткам в нем и из уравнений для значений там восстановите третий столбец и т.д.

    Вот так проделайте для 9^3 вариантов, если по пути получили числа не из диапазона 1-9, то можно дальше не считать, надо пробовать другой вариант для первого столбца.

    Чуть хуже для случая "стороны и диагонали не включая элемент". Все так же переберите 3 числа в первом столбце. Во втором столбце вы получаете 3 уравнения: сумма первых двух чисел известна из числа в первой строке. Сумма всех трех известна из числа для второй строки. Сумма двух последних - из последнего числа. Т.е. вам дано x+y=A, x+y+z=B, y+z=C. Отсюда элементарно z=B-A, x=B-C, y=A+C-B.

    Этот перебор отработает где-то за 1мс - довольно быстро.

    Есть более общий метод. У вас есть матрица из неизвестных, а каждое число в заданной матрице - это правая часть линейного уравнения. Вот составьте матрицу - выпишите эти все линейные уравнения. Методом Гаусса ее преобразуйте в диагональный вид. Какие-то переменные станут свободными - их надо перебрать. Оставшиеся по известным уравнениям посчитать.
    Ответ написан
    Комментировать
  • Как сделать constexpr strtol?

    @dima20155
    you don't choose c++. It chooses you
    Вроде, нет никакой сложности сделать compile-time strtol
    https://godbolt.org/z/z1o7f63K1
    Ответ написан
    8 комментариев
  • Программу для напоминания?

    @armid
    А чем встроенный планировщик заданий не подходит?
    Настраиваем триггер на тот же батник, который выкидывает Alert.

    Плюсы:
    — не громоздкость;
    — бесплатность;
    — без лишнего зоопарка софта.
    Ответ написан
    Комментировать
  • В чем проблема в коде работы с графом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Зачем делать безсмысленный makeStep? Пускай он возвращает булево значение.

    boolean makeStep(Graph &graph, ValuesTable &table) { .... }


    Не было отрицательных свойств среди вершин - значит пускай вернет true.
    Тогда будет стоп алгоритма. И не надо будет
    делать дополнительных пере-расчетов.
    Ответ написан
    7 комментариев
  • Через какой алгоритм решать эту задачу?

    Adamos
    @Adamos
    Когда не знаешь, как решать задачу программно - это нормально.
    Надо взять листочек и начать решать ее руками.
    12 этаж, есть два варианта - вверх или вниз. Считаем их, получаем этажи, на каждом два варианта...
    Внезапно доходит, что если уже рассматривал варианты для этажа, то второй раз это можно не делать, результаты будут те же.
    Значит, помечаем посещенные этажи - и крутим варианты, отсекая те, которые ведут на уже посещенные.
    Банальной рекурсией, например...
    Из кода осталось только написать функцию, которая выдаст два варианта для текущего номера этажа - по подробной инструкции из задачи.
    Ответ написан
  • Через какой алгоритм решать эту задачу?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Стоя на 12 этаже можно за 1 ход попасть на 23 этах (Вверх) или на 6 этаж (Вниз).
    Стоя на 6 этаже можно за 1 ход попасть на 11 этаж (ВВ) или на 3 этах.
    (и так далее)

    Вот такой граф получается. Немного напоминает Гипотезу Коллатца. За счет минус единички
    адрес меняется четность и есть надежда что мы не зациклимся а все таки куда-то двигаемся.
    Значит можно упорным баловством с кнопками куда-то приехать.

    Вобщем нужен орграф с 70 вершинами и опционально с 2 ребрами для каждой вершины.
    Недостижимые вершины - это этажи куда нельзя будет попасть соотвественно.
    Ответ написан
    4 комментария
  • Что не так с кодом, проверяющим логическую схему?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Во-первых, у вас цикл от 0 до 32 включительно. Т.е. вы на последней, 33-ей итерации пытаетесь преобразовать 0b100000 в bitset, фактически, второй раз учитывая вариант со всеми нолями. Вот почему вы получаете 33 а не 32.

    Во-вторых, у вас ошибка с тем, что вы из bitmask берете биты, которые есть числа 0 и 1 и проводите над ними битовые операции, а не логические. И это у вас там 32-битные числа же! Для | и & оно еще совпадает с вашими ожиданиями, а вот ~ обращает ВСЕ 32 бита числа.

    Поэтому ~(bitset[E] | bOrD) всегда выдаст или -1 или -2. Вы потом это пропустите через or, получите опять же -1 или -2 и в конце преобразуете это в bool. И вот тут-то оно всегда и станет true.

    Чтобы это исправить, или используйте логические операции (||, &&, !), или вместо ~x используйте x^1, или в самом конце возвращайте результат с &1, чтобы значения остальных бит ни на что не влияли.
    Ответ написан
    5 комментариев