#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<algorithm>
#include<list>
#include<map>
#include<iterator>
#include<ctime>
using namespace std;
typedef multimap<string,string> multimap_1;
typedef multimap_1::value_type PS;
typedef multimap_1::const_iterator PSi;
typedef istream_iterator<string> string_input;
typedef ostream_iterator<string> string_output;
typedef string::const_iterator Str_iter;
typedef struct _TREE {
int n;
map<char,_TREE> child;
list<string> words;
}TREE;
void Search(Str_iter wd,TREE *parents,string str,ofstream *result) {
list<string>::const_iterator b;
TREE *temp;
temp = &(parents->child[*wd]);
// 단어를 트리에 삽입할때 내려왔던 길이 아니면 리턴
if(temp->n != 1) { return; }
if(!(temp->words.empty())) {
for(b=temp->words.begin();b!=temp->words.end();++b) {
string a = *b;
a += '\n';
result->write(a.c_str(),a.size());
}
}
if(!(str.empty())) {
string temp_string = str;
char same= '~';
for(wd = str.begin();wd != str.end();++wd) {
temp_string = temp_string.erase(0,1);
if(same != *wd) {
Search(wd,temp,temp_string,result);
} else {
same = same;
}
same = *wd;
}
}
}
int main() {
ifstream ifs("words.txt");
multimap_1 word_pairs;
TREE tree,*cur_tree;
time_t t;
t = time(NULL);
cout << ctime(&t) << endl;;
cout << "파일을 읽고 있습니다"<< endl;
//멀티맵으로 단어 복사
for(string_input in(ifs);in != string_input(); ++in) {
string word = *in;
// 길이가 3 이하인것은 복사하지 않음.
if(2 < in->size()) {
word = _strlwr(_strdup(word.c_str()));
sort(word.begin(),word.end());
word_pairs.insert(PS(word,*in));
}
}
Str_iter str_iter;
PSi j, k,s; // multimap_1 의 iterator
cout << "단어를 정렬합니다 " << endl;
for(j = word_pairs.begin(); j != word_pairs.end();++j) {
cur_tree = &tree;
//트리에 삽입
for(str_iter=j->first.begin();str_iter != j->first.end();++str_iter) {
cur_tree = &(cur_tree->child[*str_iter]);
cur_tree->n = 1; // 자신이 내려갔던 길을 체크
}
cur_tree->words.insert(cur_tree->words.end(),j->second);
cur_tree = &tree;
}
// string st = "pestilential",st2; // 테스트용
list<string> result;
cout << "검색 & 출력합니다" << endl;
cur_tree = &tree;
char bn = '~';
string st2;
ofstream ofs("test.txt");
for( s = word_pairs.begin(); s != word_pairs.end(); ++s) {
st2= s->first;
ofs << "단어: "<< s->second << endl;
for(str_iter = s->first.begin();str_iter != s->first.end();++str_iter) {
st2 = st2.erase(0,1);
if( 2 > st2.size()) { break; }
if( bn != *str_iter) {
Search(str_iter,cur_tree,st2,&ofs);
}
bn = *str_iter;
}
bn = '~';
}
ofs.close();
t = time(NULL);
cout << ctime(&t) << endl;
return 0;
}
단어사전은 words.txt로 주어진다.
결과는 test.txt파일에 담겨진다.
##################################################################################
안녕하세요.
C로 게임을 만들려고하는데, 궁금증이 있어서 문의드립니다
text파일안에 수만개의 영단어들이 있는데,
제가 그중에 한 단어를 임의로 가져와서 ex) OHMYGOD
섞은후에 유저에게 보여주어야 합니다 ex ) DOGHOMY
그리고 저기위에 나와있는 단어를 기준으로 다시 text파일을 검색후에 저 단어로 만들수있는
단어들을 모두 보여줘야하는데, 예를 들어 DOG OH MY 라는 단어들이 하나씩 나뉘어져 있으면
각각의 단어들을 *** ** **이런 식으로 별표로 표기후에 유저가 정답을 맞추면 답을 보여주는 식으로
프로그램을 작성중인데, 문제점이 있습니다.
하나의 단어를 임의로 가져온후에 저 단어를 어떤식으로 이용해서 text파일안에 조합가능한 단어를
찾을수있는지 알고리즘을 부탁드리겠습니다.
수고하세요
======================================================================
구성과 같은 경우가 되는 것을 찾을 수 있을 것입니다.
'c·c++ > c++ 프로그래밍' 카테고리의 다른 글
2진수를 10진수로 바꾸기 (0) | 2013.10.05 |
---|---|
if문 없는 간단한 카드게임 (0) | 2013.09.10 |
c++ 입력오류 해결 (0) | 2013.05.31 |
복소수 클래스 (0) | 2013.05.04 |
소인수 분해 (0) | 2013.04.08 |