Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Почему оно падает?

Ответить
Настройки темы
Почему оно падает?

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


Совсем себя криворуким что-то считать себя начал... Для решения этой простой задачи ( http://acm.timus.ru/problem.asp?id=1002 ) на скору руку была сваяна следующая программа (см. ниже), как ни странно сразу великолепно откомпилилась (bcc55) и даже заработала, однако когда я её отсылаю на проверку робот мне шлёт мыло мол она завалилась с Access violation'ом. Вот мне интересно стало из-за чего же. Даже explicit memory managment'а не было.

Собственно код:
Код: Выделить весь код
#include <iostream>
#include <string>
#include <list>

// It's a bit dirty way... Classes shoud have been used instead :)

typedef std::list< std::string > Solution;
typedef std::string              DigitsSequence;

struct Word
{
    std::string word, prepared_word;
    Word( const std::string & _word, const std::string & _prepared_word ):
        word         ( _word ),
        prepared_word( _prepared_word )
    {}
};


struct Task
{
    std::list< Solution >  solutions;
    std::list< Word >      words;
    std::string            number; // it's simplier to use number as a
                                   // sequence of digits (characters)
    // Next data is used during solving.
    Solution cur;
    std::string::const_iterator pos_in_number;
};


struct LetterToDigit
{
    char   digit;
    char * letters;
};

LetterToDigit letter_to_digit[[]] =
{
    { '0', "oqz" },
    { '1', "ij"  },
    { '2', "abc" },
    { '3', "def" },
    { '4', "gh"  },
    { '5', "kl"  },
    { '6', "mn"  },
    { '7', "prs" },
    { '8', "tuv" },
    { '9', "wxy" }
};

std::string prepare_word( const std::string & word )
{
    std::string ret = word;
    for( std::string::iterator it = ret.begin();
         it != ret.end();
         ++it )
    {
        for( int i = 0; i < sizeof( letter_to_digit ); ++i )
            for( char * c = letter_to_digit[[i]].letters; *c; ++c )
                if( *it == *c )
                {
                    *it = letter_to_digit[[i]].digit;
                    i = sizeof( letter_to_digit );
                    break;
                }
    }
    return ret;
}

bool starts_of( std::string::const_iterator word,
                std::string::const_iterator subword )
{
    while( *subword )
    {
        if( *subword != *word )
            return false;
        ++subword;
        ++word;
    }
    return true;
}


void find_solutions( Task & task )
{
    for( std::list< Word >::const_iterator it = task.words.begin();
         it != task.words.end();
         ++it )
    {
        if( starts_of( task.pos_in_number, it->prepared_word.begin() ) )
        {
            task.cur.push_back( it->word );
            task.pos_in_number += it->word.size();
            if( task.pos_in_number == task.number.end() )
                task.solutions.push_back( task.cur );
            else
                find_solutions( task );
            task.pos_in_number -= it->word.size();
            task.cur.pop_back();
        }
    }
};


std::string find_best_solution( Task & task )
{
    task.pos_in_number = task.number.begin();
    find_solutions( task );
    if( task.solutions.size() == 0 )
        return "No solution.";
    else
    {
        std::list< Solution >::const_iterator it
            = task.solutions.begin();
        std::list< Solution >::const_iterator shortest_solution = it;
        for( ; it != task.solutions.end(); ++it )
            if( it->size() < shortest_solution->size() )
                shortest_solution = it;

        Solution::const_iterator word = shortest_solution->begin();
        std::string ret = *word;
        if( ++word != shortest_solution->end() )
            for( ; word != shortest_solution->end(); ++word )
                ret += " " + *word;
                
        return ret;
    }
}

int main()
{
    std::string tmp;
    for( ;; )
    {
        std::cin >> tmp;
        if( tmp == "-1" )
            break;
        Task task;
        task.number = tmp;
        int num;
        std::cin >> num;
        for( ; num > 0; --num )
        {
            std::cin >> tmp;
            task.words.push_back( Word( tmp,
                                        prepare_word( tmp ) ) );
        }
        std::cout << find_best_solution( task ) << "\n";
    }
    return 0;
}

-------
http://ivank.ru


Отправлено: 13:55, 13-12-2002

 
chOOk


Сообщения: n/a

Профиль | Цитировать


Уважаемы ivank, вы часом не гений по части алгоритмизации? Сложность этой задачи на Timus'е = 84%, процент принятых задач - 6%
"легкая..."

Вероятнее всего причина в том, что в проверяющей системе стоит компилятор MSVC 6.0 и там замечено много глюков с STL

Еще одна прична - возможность наличия во входных данных букв в верхнем регистре.

Отправлено: 03:43, 19-01-2003 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


chOOk
Я не гений. Совсем не гений. Но по-моему эта задача без проблем решается полным перебором.

-------
http://ivank.ru


Отправлено: 04:31, 19-01-2003 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Почему оно падает?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
падает VPN падает! не работает роутинг по статике flexman Microsoft Windows NT/2000/2003 0 01-06-2009 10:01
Разное - VISTA а оно вобще нужно? ospa Microsoft Windows Vista 51 05-08-2007 13:05
truns cleaner зачем оно мне??? Alyaa Защита компьютерных систем 9 26-08-2006 15:45
Что такое Msout32 и почему оно висит? Daiz13 Microsoft Windows 95/98/Me (архив) 3 06-12-2002 03:31




 
Переход