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

Анаграммы - C++

Восстановить пароль Регистрация
 
artlinenn
0 / 0 / 0
Регистрация: 15.02.2013
Сообщений: 58
02.05.2013, 00:59     Анаграммы #1
Задается словарь. Найти в нем все анаграммы (слова, составленные из одних и тех же букв).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 00:59     Анаграммы
Посмотрите здесь:

Строки.Анаграммы.(Задача сделана,но не выводит результат...) C++
C++ Файлы и анаграммы
Слова-анаграммы C++
C++ Анаграммы
Анаграммы(олимпиадная задача) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UnsKneD
алкокодер
 Аватар для UnsKneD
153 / 149 / 11
Регистрация: 27.12.2012
Сообщений: 548
02.05.2013, 06:36     Анаграммы #2
Цитата Сообщение от artlinenn Посмотреть сообщение
Задается словарь
где?

Добавлено через 1 час 7 минут
Вот такая вот кривулина
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
#include <iostream>
#include <fstream>
 
using std::ifstream;
 
bool _compare( char* a, char *b){
    for( int i = 0; a[i]!='\0'; i++){
        if( a[i] != b[i]){
            return false;
            break;
        }
    }
    return true;
};
bool compare( char *a, char *b ){
    int count = 0;
    int d[1024];
    
    if( !_compare(a,b)){
        for(int i = 0; a[i]!='\0'; i++){
            for(int j = 0; b[j]!='\0'; j++){
                bool fl = true;
                for(int k = 0; k<count; k++){
                    if( j == d[k] ){
                        fl = false;
                        break;
                    };
                };
                if( fl ){
                    if(a[i] == b[j] ){
                        d[count++] = j;
                        break;
                    };
                }
            }
        };
    };
 
    if( count == strlen(b) ){
        return true;
    };
    return false;
}
 
int main(){
    setlocale(0,"");
    char temp[64], temp2[64];
    ifstream fjalor("fjalor.txt");
    while( !fjalor.eof() && fjalor.getline(temp,sizeof(temp))){
        ifstream tempFjalor("fjalor.txt");
        bool fl = true;
        while( !tempFjalor.eof() && tempFjalor.getline(temp2,sizeof(temp2))){
            if( compare(temp, temp2) ){
                if( fl ) { std::cout << "Для " << temp << std::endl; fl = false; }
                std::cout << temp2 << std::endl;
            };
        };
    };
    return 0;
}
gazlan
2863 / 1811 / 272
Регистрация: 27.08.2010
Сообщений: 4,908
Записей в блоге: 1
02.05.2013, 07:27     Анаграммы #3
словарь
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.05.2013, 23:31     Анаграммы #4
На коленке, но все пары анаграмм выводит.
Список слов отсюда.
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
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <iterator>
#include <algorithm>
 
class Word {
 public:
  Word() {}
  Word(const std::string &word) : word(word), size(word.size()),
    sumOfLetters(getSumOfLettersForAWord(word)), sorted(word) {
    std::sort(sorted.begin(), sorted.end());
  }
  const std::string &getWord() const { return word; }
  const std::string &getSortedWord() const { return sorted; }
  int getSize() const { return size; }
  int getSumOfLetters() const { return sumOfLetters; }
  static int getSumOfLettersForAWord(const std::string &word) {
    int result = 0;
    for (size_t i = 0; i < word.size(); ++i) {
      result += word[i];
    }
    return result;
  }
 private:
  std::string word;
  int size;
  int sumOfLetters;
  std::string sorted;
};
 
bool operator<(const Word &a, const Word &b) {
  if (a.getSize() == b.getSize()) {
    if (a.getSumOfLetters() == b.getSumOfLetters()) {
      return a.getWord() < b.getWord();
    }
    return a.getSumOfLetters() < b.getSumOfLetters();
  }
  return a.getSize() < b.getSize();
}
 
std::ostream &operator<<(std::ostream &stream, const Word &word) {
  return stream << "Word{" <<
    "word='" << word.getWord() << "'," <<
    "size=" << word.getSize() << "," <<
    "sumOfLetters=" << word.getSumOfLetters() << "}";
}
 
int main() {
  std::ifstream file("brit-a-z.txt");
  std::set<Word> words;
 
  while (!file.eof()) {
    std::string word;
    std::getline(file, word);
    if (!file.eof()) {
      words.insert(Word(word));
    }
  }
 
  for (std::set<Word>::const_iterator i = words.begin(); i != words.end();) {
    std::set<Word>::const_iterator j = i; ++j;
    while (j->getSize() == i->getSize() && j->getSumOfLetters() == i->getSumOfLetters()) {
      ++j;
    }
 
    for (std::set<Word>::const_iterator k = i; k != j; ++k) {
      std::set<Word>::const_iterator l = k;
      for (++l; l != j; ++l) {
        if (k->getSortedWord() == l->getSortedWord()) {
          std::cout << k->getWord() << " <-> " << l->getWord() << std::endl;
        }
      }
    }
    i = j;
  }
 
  return 0;
}
Добавлено через 1 минуту
Суть в том, что все слова сортируются по длине, затем по сумме символов.
Потом проходим по всем группам одинаковой длинны и одинаковой сумме символов, набирая из них настоящие пары анаграмм.
Yandex
Объявления
02.05.2013, 23:31     Анаграммы
Ответ Создать тему
Опции темы

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