• Как построить такую грамматику?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    S -> 2*2A-1
    A -> *2A-1 | E
    Ответ написан
    Комментировать
  • Как можно реализовать?

    @Mercury13
    Программист на «си с крестами» и не только
    Подсчитать кол-во нулей (единиц, двоек, троек). Если неодинаково — нельзя.
    Иначе — подсчитаем такую матрицу (4×4). Если в 1-й строке на i-м месте 1, а во 2-й 3, прибавляем единицу к a[1, 3].
    a[i, i] не учитываем: они уже на своих местах.
    a[i, j] и a[j, i] взаимокоменсируем: каждая такая парочка даёт min(a[i, j], a[j, i]) перестановок.
    Точно так же пересматриваем все тройки a[i, j], a[j, k] и a[k, i]. Как всегда, взаимокомпенсируем их; каждая такая тройка даёт 2·min(•, •, •) пререстановок.
    Остаётся просуммировать всё, что осталось (кроме диагонали, разумеется), и помножить на 3/4.
    Ответ написан
    Комментировать
  • Как можно реализовать?

    alsopub
    @alsopub
    Мне видится это так.
    Берем исходный массив { 1, 0, 2, 2, 3, 0, 1 }.
    Строка, которую надо переставить { 3, 2, 0, 0, 1, 1, 2 }.
    Берем первый элемент 3, он не на месте, ищем где он должен быть, переставляем.
    Получаем { 1, 2, 0, 0, 3, 1, 2 }, увеличиваем число использованны перестановок.
    Снова смотрим первый элемент, он совпал, смотрим второй.
    И так пока не дойдем до конца.
    (есть чувство что надо что-то еще учесть, чтобы избежать бесполезных перестановок типа 3 поменять на 3, а еще лучше - удалять из обоих массивов совпадающие по расположению элементы, которые уже не нужно переставлять)
    Если по условию задачи возможна ситуация когда строки вообще не совпадают - то проверить на возможность решения удалением из одного массива элементов из другого.
    Ответ написан
    1 комментарий