Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 03.07.2011, 02:17   #1
Пират
Новичок
Джуниор
 
Регистрация: 03.07.2011
Сообщений: 1
Восклицание Необходимо решение задачи на рекурсию

Доброго времени суток, уважаемые знатоки.
Возникла проблема с решением данной программы. Надеюсь услышать не глупые советы в стиле - решается простой рекурсией, или что тут всё просто как два пальца
Суть : Дана строка, состоящая из M попарно различных символов. Вывести все перестановки символов данной строки.
Ввод
В первой строке файла находится исходная строка.
Вывод
Вывести в каждой строке файла по одной перестановке. Перестановки можно выводить в любом порядке. Повторений и строк, не являющихся перестановками исходной, быть не должно.
Ограничения
2 ≤ M ≤ 8; символы - буквы латинского алфавита и цифры.

Ввод
IOX
Вывод
XOI
OIX
IXO
XIO
OXI
IOX

Как не тяжело догадаться количество комбинация = !n где n количество символов в строке. Хотел бы увидеть полное решение на СИ (не СИ++, и не на паскале и не дельфи и не что другое))) Спасибо заранее
Пират вне форума
Старый 03.07.2011, 06:27   #2
como
Форумчанин
 
Регистрация: 26.07.2008
Сообщений: 116
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

void swap(char * a, char * b)
{
    char t = *a;
    *a = *b;
    *b = t;
}

void reverse(char * first, char * last)
{
    for (; first != last && first != --last; ++first)
        swap(first, last);
}

int next_perm(char * first, char * last)
{
    char * p = first;
    if (p == last) return 0;

    ++p;
    if (p == last) return 0;

    p = last;
    --p;

    for (;;)
    {
        char * q = p;
        --p;

        if (*p < *q)
        {
            char * r = last;
            while(!(*p < *--r))
                ;

            swap(p, r);
            reverse(q, last);
            return 1;
        }

        if (p == first)
        {
            reverse(first, last);
            return 0;
        }
    }
}

int char_comp(void const * a, void const * b)
{
    return *((char const *) a) - *((char const *) b);
}

void print_perms(char * first, char * last)
{
    qsort(first, last - first, 1, char_comp);

    do
    {
        puts(first);
    } while (next_perm(first, last));
}

int main()
{
    char str[] = "IOX";
    print_perms(str, str + sizeof str - 1);
}
como вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Специфические задачи на рекурсию на C++ ($) DaryaArt Фриланс 2 27.04.2011 02:19
Необходимо решение задачки ($) False Фриланс 14 21.04.2011 20:10
Решение задачи zircon Паскаль, Turbo Pascal, PascalABC.NET 4 10.04.2011 00:14
решение задачи Claster Общие вопросы Delphi 17 16.09.2008 21:08