• Как отобразить плоскость на сфере?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это очень спорная тема. Без каких-то искажений вы проекцию никогда не получите. Сфера и плоскость обладают несовместимыми топологическими характеристиками.

    Один вариант, сохраняющий углы, но не сохраняющий пропорции - проекция меркатора. Фактически, это циллиндрическая проекция: https://en.wikipedia.org/wiki/Map_projection#Cylin...

    Сначла спроецируйте параметризуйте вашу карту, выделив в ней прямоугольную карту мира. Потом спроецируйте этот прямоугольник на цилиндр вокруг сферы. И потом уже спроецируйте каждую точку цилиндра на сферу.
    Ответ написан
    Комментировать
  • Как замостить ориентированный по осям Rectangle блоками максимального размера, обходя препятствия?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Во-первых, не очень понятно, зачем вам вообще это. Агрегируя квадратики в прямоугольники вы будете находить не самые короткие пути в этом графе. Каким алгоритмом вы дальше в графе работаете? Какой-нибудь Jump point search на неаггрегированных клетках может быть быстрее чего-бы то нибыло по аггрегированным.

    Далее, если вам так хочется, то ваша задача аггрегирования - NP и кроме полного перебора вы не найдете оптимальное решение. Но вам, похоже, подойдет какое-нибудь достаточно хорошее решение, а не только оптимальное. Тогда будут работать всякие жадности и эвристики. Можно, например, брать самую левую-верхнюю непокрытую клетку и жадно растить вокруг нее максимальный по площади прямоугольник, который не пересекает ни одну покрытую или запрещенную клетку (допустим, перебирая нижнюю и верхнюю границу и жадно раздувая левую и правую до максимума). На примере из вопроса этот алгоритм построит 7 прямоугольников.
    Ответ написан
    3 комментария
  • Проблема с двусвязным списком?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Ошибка в push: prev предпоследнего элемента указывает на него же, а prev у последнего всегда null.

    Ошибка в result: вы переписываете значение последнего элемента зачем-то.

    Потом в цикле вы сначала удаляете элемент p, а потом переходите по p->next, читая уже удаленную память. Но это не беда, потому что второй цикл ни разу не выполняется (почему, догадаетесь?).

    В main вы зачем-то выделяете h и t, только чтобы сразу же устроить утечку этой памяти.
    Ответ написан
    2 комментария
  • Как сравнить два дерева каталогов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Рекурсия. Функции передаются 2 каталога. Она сравнивает файлы в них и добавляет новые/пропавшие файлы в списки. Также смотрит на директории. Если какая-то директория новая, то другая рекурсивная функции добавляеет все файлы и каталоги в ней в список новых. Также удаленные директории добавляются в список. Если какая-то директория есть и там и там, то рекурсивно вызывйтесь от них.
    Ответ написан
  • Почему не работают заголовочные файлы?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Потому что так работает система "модулей" в СИ++ (никакие это не модули, а атавизм времен C без плюсов. От этого куча проблем, но по нормальному сделать никак не могут).

    Каждый cpp файл подключает объявления из остальных "модулей" через include хедеров. Потом каждый "модуль" собирается в объектный файл в котором есть реализации каких-то методов, а каких-то - нет, но они там используются. А потом линковщик собирает все объектные файлы в один исполняемый файл, где все-все-все реализованно.

    Вы же пытаетесь скомпилировать только один модуль сразу в исполняемый файл. Компилятор не находит реализацию класса A (она же в A.cpp. В A.h - только декларация).

    Если в проекте больше одного cpp файла - используйте систему сборки, вроде Cmake (есть и под windows).

    Или если хотите руками - тогда надо сначала собрать все объектные файлы и потом из них исполняемый:
    g++ -c a.cpp -o a.o
    g++ -c main.cpp -o main.o
    g++ a.o main.o -o main.exe
    Ответ написан
    4 комментария
  • Почему не переводит на новую строчку в терминале через uart?Как очистить терминал?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Попробуйте "%i\n" в sprintf передавать.
    Ответ написан
  • Как правильно объявить и заполнить динамический массив указателей на строки?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Скобки вокруг *arr расставьте. И еще, вы зря делаете malloc() для самих строк - вы потом присваеваете адрес строковой константы. Или делайте strcopy, или не выделяйте память под (*arr)[i].
    Ответ написан
  • Как достать видео без водяных знаков из TikTok?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    В худшем случае, водяной знак вкодирован в само видео и без него никак не вытащить. Можно проверить, сохранив видео каким-нибудь расширением "Video Download Helper". А так, надо реверс инженирить сайт.
    Ответ написан
  • Где взять math.h?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно считать экспоненту через ряд тейлора. Правда, тут только e возводится в степень. Если вам надо возводить произвольное число, то надо отдельно считать натуральный логарифм от основания и домножать на него степень. Тоже рядом (смотрите секцию "Вариации и обобщения").
    Ответ написан
  • Почему программа выдаёт неверное, но близкое значение?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Потому что вычисления происходят не точно из-за ограниченности встроенных типов данных с плавающей запятой. Полученные ошибки округления накапливаются и вы получаете что-то очень близкое к аналитическому ответу, но не его.

    Можно в тестах требовать совпадение с некоторой абсолютной или относительной погрешностью.

    Если нужна максимальная точность, то нужно использовать длинную арифметику или с плавающей или фиксированной точкой. Или считать в рациональных числах (тоже придется самим писать тип или использовать библиотеку).

    Еще можно использовать более устойчивые к ошибкам округления методы. Метод гаусса не лучший выбор.
    Ответ написан
    Комментировать
  • Как перевести бинарную строчку в символ?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вряд ли. Есть, где из строки "00010100" в число. Но чтобы из такого формата - вряд ли. Можно руками элементарно же сделать:
    unsigned char ans = 0;
    for (i = 0; i < 8; ++i) {
      ans |= static_cast<unsigned int>(tableCombinationSymbol[i]) << i; // или (7-i), если порядок бит другой.
    }
    Ответ написан
    Комментировать
  • Как решить эту ошибку?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Перепишите этот ужас с нуля. Там невозможно найти ошибку.

    Советую воспользоваться тем, что условные операторы вычисляются лениво: Если написать A && B и A окажется false, то B даже не будет вычисляться.

    Так, проверка на клетку сверху может быть написана так:
    if (i > 0 && a[i-1][j] - мина)

    Так вся ваша простыня выродится в 8 последовательных проверок. Если меняются обе координаты, то надо через && объединить 3 условия - 2 на проверку невыхода за границы массива, и последнее - проверка значения массива.

    Еще можно завести массив на SIZE+2 x SIZE+2 и заполнять его с (1, 1). Фактически, создается каемка вокруг исходного массива. И пробегаться по нему надо от 1 до SIZE. Так, вокруг всегда будут все 8 соседей. В этом подходе не придется проверять на выход за границы массива.

    А еще можно вместо 8 if-ов сделать цикл на 8 итераций, если завести константы для приращений:
    const int kDx[] = {1, 1, 1, 0, -1, -1, -1, 0};
    const int kDy[] = {1, 0, -1, -1, -1, 0, 1, 1};


    Теперь всех соседей можно перебрать как (i + kDx[k], j + kDy[k])
    Ответ написан
    Комментировать
  • Какой тип данных используется для чисел с фиксированной запятой на C?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Нету такого типа. Можно его проэмулировать, используя целочисленный тип.
    Ответ написан
    5 комментариев
  • Как решить задачу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если просят использовать циклический список, то значит вам их давали. Повторите материал, поищите методички. И поймете, как работать со списками. А дальше - все просто. Создайте циклический список из чисел от 1 до n, возьмите указатель на первого чувака. Потом n-1 раз пропускайте одного чувака и удаляйте из списка следующего.
    Ответ написан
  • Как читать формулы и записывать их в код?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    В смысле, как читать? Слева направо, соблюдая порядок операций.

    Вот первая формула r= ... - это значит, что значение переменной r вычисляется по выражению справа. Там участвуют переменные p, g, значения которых вам даны.

    Там дробь, в числителе стоит сумма p и g. В знаменателе один плюс значение логарифма в квадрате от суммы корня pg+p и g^2. Расставьте скобки и получите (p+g)/(1+log(...)*log(...))

    Аналогично вторая формула для y через p,g,r и z ( три из них вам даны, r вычисляется в предыдущем действии).

    Возведение в квадрат - зависит от языка программирования. Или функция sqr(), или **2, или просто написать (выражение)*(выражение). lg() - вызов встроенной функции логарифма. Опять же, зависит от языка, как именно она называется у вас. Квадратный корень - функция sqrt().
    Ответ написан
    1 комментарий
  • Как ввести неопределённое количество строк С++?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Если тут произвольная длина в смысле не "вам надо считать ровно 5 символов", то можно читать в std::string. Оно само выделит достаточно памяти.

    Вот так прочтется одно слово до пробела (или конца файла):
    std::string s;
    std::cin >> s;


    Вот так прочтется строка целиком до перевода строки (или конца файла):
    std::getline(cin, s);

    Потом можно по string проходится как по массиву, от 0 до s.length()-1.
    Ответ написан
    Комментировать
  • Алгоритм Рабина-Карпа. В чем ошибка?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Возможно там переполнение. Убедитесь, что у вас все хеши везде считаются только с участием unsigned типов. Переполнение в signed - это Undefined behavior.
    Ответ написан
    9 комментариев
  • Ошибка xmemory при return, как пофиксить?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Скорее всего, тип User нельзя вот так вот читать и писать в файл. Подозреваю, что там содержатся std::string, которые сами в себе хранят лишь указатели на символы в строке. Поэтому, если std::string записать в файл как набор байт, то вы запишете в файл указатели. Прочитав их назад из файла, вы получите случайне адреса, не указывающие ни на что.

    Вам придется писать руками ввод и вывод типа из файла.
    Ответ написан
    1 комментарий
  • Как правильно решить задачу про кузнечика путём динамического программирования?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вы поняли, что это динамическое программирование. Опишите, что у вас за функция ДП, дайте формулу пересчета, базу и где ответ.
    Ответ написан
  • Как реализовать такую функцию где надо используя аргументы (+ - / *) вставляя между цифрами получить заданное чисто. Как вывести все результататы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Только перебор всех возможных вариантов.
    Ответ написан
    Комментировать