Форум программистов, компьютерный форум CyberForum.ru

Создание чайнворда - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
G@F$ik
0 / 0 / 0
Регистрация: 16.05.2010
Сообщений: 5
17.05.2010, 22:48     Создание чайнворда #1
Дорогие друзья, самая голимая(извиняюсь за это слово, лучше не подобрал) тема, которую можно было цепануть для курсача, это та, которая досталась мне - программа, генерирующая чайнворд. Слова для генерации выбираются из словаря, который прилагается к проге
Чайнворд, для пояснения, это набор слов, второе слово начинается на букву, которой заканчивается первое слово, третье - на букву, которой заканчивается второе и т.д.
Первое слово, насколько я понял берется либо по желанию пользователя, либо из базы рандомно, подкиньте идею как организовать сам процесс генерации(имею в виду техническую сторону) ,может рекурсия тут подойдет, в общем кричу сос, зову на помощь(((

Добавлено через 5 минут
ЗЫ в С++ немного разбираюсь, кода всей проги не прошу, т.к. понимаю всю сложность, буду рад хотя бы какому-нибудь адекватному алгоритму)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lordtosha
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 3
20.12.2010, 21:50     Создание чайнворда #2
G@F$ik, У меня та же тема, что и у тебя, нашёл решение?
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,688
21.12.2010, 14:11     Создание чайнворда #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//////////////////////////////////////////////////////////////////////////////////////
//программа, генерирующая чайнворд. Слова для генерации выбираются из словаря, 
//который прилагается к проге
//Чайнворд, для пояснения, это набор слов, второе слово начинается на букву, 
//которой заканчивается первое слово, третье - на букву, которой 
//заканчивается второе и т.д.
//////////////////////////////////////////////////////////////////////////////////////
//Из заданного множества слов программа строит чайнворд максимально возможной длины.
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
class  T_word_node;
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string                T_word;
typedef std::vector<T_word>        T_words;
typedef T_words                    T_chainword;
typedef std::vector<T_word_node*>  T_children_ptrs;
typedef std::set<T_word>           T_words_tail;
//////////////////////////////////////////////////////////////////////////////////////
class  T_word_node
{   
    T_words_tail     words_tail_;    
    T_chainword      chainword_;        
    T_children_ptrs  children_ptrs;    
    static size_t    chainword_size_max_;
public:
    //---------------------------------------------------------------------------------
    T_word_node
        (
            const T_words_tail&  words_tail_,
            const T_chainword&   chainword_ = T_chainword()
        ) 
        : words_tail_(words_tail_), chainword_(chainword_)
    {
        chainword_size_max_ = std::max(chainword_size_max_, chainword_.size());   
        make_children();
    }
    //---------------------------------------------------------------------------------
    ~T_word_node()
    {
        for(T_children_ptrs::const_iterator  chaild_p_it = children_ptrs.begin();
            chaild_p_it != children_ptrs.end(); ++chaild_p_it)
        {
            delete  *chaild_p_it;
        }        
    }
    //---------------------------------------------------------------------------------
    bool  get_chainword(T_chainword&  chainword)
    {
        if(chainword_.size() == chainword_size_max_)
        {
            chainword = chainword_;
            return  true;
        } 
 
        for(T_children_ptrs::const_iterator  chaild_p_it = children_ptrs.begin();
            chaild_p_it != children_ptrs.end(); ++chaild_p_it)
        {
            if((**chaild_p_it).get_chainword(chainword))
            {
                return  true;
            }
        }
        return  false;
    }
    //---------------------------------------------------------------------------------
private:
    //---------------------------------------------------------------------------------
    void  make_child_with_word(const T_word&  word)
    {
        T_words_tail  words_tail_new(words_tail_);                
        words_tail_new.erase(word);
        T_chainword  chainword_new(chainword_);
        chainword_new.push_back(word);
        T_word_node*  word_node_p 
            = new T_word_node(words_tail_new, chainword_new);
        children_ptrs.push_back(word_node_p);                
    }
    //---------------------------------------------------------------------------------
    void  make_children()
    {       
        for(T_words_tail::const_iterator  word_it = words_tail_.begin();
            word_it != words_tail_.end(); ++word_it)
        {
            if(   chainword_.empty()
               || *word_it->begin() == *chainword_.rbegin()->rbegin()) 
            {
                make_child_with_word(*word_it);
            }            
        }        
    }
};
size_t  T_word_node::chainword_size_max_ = 0;
//////////////////////////////////////////////////////////////////////////////////////
T_chainword  make_chainword(const T_words&  words)
{
    T_words_tail  words_tail(words.begin(), words.end());
    T_word_node   chainword_tree(words_tail);
    T_chainword   chainword_res;
    chainword_tree.get_chainword(chainword_res);
    return  chainword_res;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const int N_MIN = 1;
    int n = 0;
    do
    {
        std::cout << "Введите количество слов в словаре для чайнворда: ";
        std::cin >> n;             
    }while(n < N_MIN);   
 
    std::cout << "Введите " 
              << n
              << " слов для чайнворда:"
              << std::endl;
 
    T_words  words;
    while(words.size() < static_cast<size_t>(n))
    {
        std::cout << "#"
                  << words.size() + 1
                  << ": ";
 
        T_word  word_cur;
        std::cin >> word_cur;
        words.push_back(word_cur);       
    }
    T_chainword  chainword_ = make_chainword(words);
    std::cout << "Чайнворд:"
              << std::endl;
 
    std::copy(chainword_.begin(), chainword_.end(), 
              std::ostream_iterator<T_word>(std::cout, "\n"));
}
lordtosha
0 / 0 / 0
Регистрация: 20.12.2010
Сообщений: 3
21.12.2010, 14:14     Создание чайнворда #4
Mr.X, Спасибо вам огромное
Banner
0 / 0 / 0
Регистрация: 15.12.2014
Сообщений: 3
19.12.2014, 22:30     Создание чайнворда #5
Mr.X, Прошу прощение, не могли бы вы расписать в этой программе комментарии к действиям , чтобы лучше понять
Yandex
Объявления
19.12.2014, 22:30     Создание чайнворда
Ответ Создать тему
Опции темы

Текущее время: 08:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru