Создание фразы с заданным векторным вектором слов в переполнении стека

Пока что моя программа на С ++ выглядит так:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
int i;
int maxLet;
const int NumWords = 26;
const int NumPhrase = 8;
string ele;
string n[NumWords] = {
"crypt",  "by",     "my",     "cysts",  "glyph", "psych", "shyly",
"slyly",  "try",    "sylph",  "tryst",  "gypsy", "ply",   "pry",
"shy",    "sly",    "spy",    "thy",    "cry",   "sty",   "glyphs",
"sylphs", "trysts", "crypts", "psychs", "sprly"};
vector<string> words(n, n + NumWords);
vector<string> phrase(n, n + NumPhrase);
for (i = 0; i < words.size(); i++) {
cout << words.at(i) << endl;
cout << words[i] << endl;
}

char aaaaa;
cin >> aaaaa;
return 0;
}

Мне нужно создать фразу, которая напоминает
[YYY] [YYYYY] [YYYBC] [GHLLLM] [PPPRR] [RS] [SS] [SSTTT] Где буквы зашифрованы, а скобки обозначают длину слова.
По сути, мне нужно создать фразу слов с этими конкретными длинами слов, и тем конкретным количеством букв
Всего есть,
11 лет
1 б
1 с
1 г
1 ч
3 л
1 м
3 р
3 р
5 с
3t-х
Я вырывал свои волосы, пытаясь понять, как это сделать. Ваш вклад будет принята с благодарностью.

0

Решение

Поскольку все ваши шаблоны слов (набор […]) различны, вам просто нужно подсчитать возможные совпадения для каждого такого элемента и умножить эти числа. Итак, давайте сначала напишем такую ​​функцию:

bool isMatch(string templ, string word)
{
sort(templ.begin(), templ.end());
sort(word.begin(), word.end());
return templ==word;
}

long long countMatches(string templ, vector<string> const& dict)
{
long long ret=0;
for(int i = 0; i < dict.size(); i++)
ret += isMatch(templ, dict[i]);
return ret;
}

long long finalAnswer(vector<string> const& templs, vector<string> const& dict)
{
long long ans=1;
for(int i=0; i<templs.size(); i++)
ans*=countMatches(templs[i], dict);
return ans;
}
1

Другие решения

Поскольку постановка задачи недоступна, я предполагаю, что:

  1. Слова фраз в общем должны использовать общие символы внутри [] но не каждое слово точный символ внутри [],
  2. Фраза должна использовать точно все символы внутри []
  3. Вы можете использовать слово более одного раза (может быть легко обновлено, чтобы использовать слова только один раз)
  4. Используемые слова вводятся в нижнем регистре.
  5. Символ для использования в фразе вводится в верхнем регистре.

Код (протестирован в GCC 4.9.0 с C ++ 11):

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

bool can_use_word(std::vector<long>& chars_in_phrase, const std::string& word) {
unsigned int idx = 0;
bool valid = true;
// Verifing that the word could be used, that no char is used more that the
// phrase indicate
// Updating the char use count in place.
for (; idx < word.size(); idx++) {
if (chars_in_phrase[word[idx] - 'a'] == 0) {
valid = false;
break;
}

chars_in_phrase[word[idx] - 'a']--;
}

if (!valid) {
// If invalid revert the char use count as before.
for (unsigned int idx_revert = 0; idx_revert < idx; idx_revert++) {
chars_in_phrase[word[idx_revert] - 'a']++;
}
return false;
}
return true;
}

bool solve_phrase(std::vector<long>& chars_in_phrase,
std::vector<long>& phrase_word_length,
const std::vector<std::string>& words_to_use,
std::vector<std::string>& phrase,
unsigned int phrase_word_idx = 0) {
if (phrase_word_idx == phrase_word_length.size()) {
// If we reach the last word length of the phrase and no char is left
// for use, we found our solution.
bool valid = true;
for (auto cu : chars_in_phrase) {
if (cu != 0) {
valid = false;
break;
}
}
return valid;
}

// Find the first word with the length needed.
auto it = std::find_if(
words_to_use.begin(), words_to_use.end(),
[&phrase_word_length, phrase_word_idx](const std::string& str) {
return str.size() == phrase_word_length[phrase_word_idx];
});

// If not have the length needed (it's not possible in the actual algorithm,
// because we allow using
// the same word multiple times, if its only used once, could be necessary).
if (it == words_to_use.end() ||
it->size() != phrase_word_length[phrase_word_idx])
return false;

// Iterate throught the words with the same target length.
while (it != words_to_use.end() &&
it->size() == phrase_word_length[phrase_word_idx]) {
if (can_use_word(chars_in_phrase, *it)) {
phrase.push_back(*it);
// Continue searching the next word in the phrase
if (solve_phrase(chars_in_phrase, phrase_word_length, words_to_use,
phrase, phrase_word_idx + 1))
return true;
// If it reach dead end, revert the state of the used chars and
// continue with the next possible word.
phrase.pop_back();
for (unsigned int idx = 0; idx < it->size(); idx++) {
chars_in_phrase[(*it)[idx] - 'a']++;
}
}
it++;
}

return false;
}

int main() {
std::vector<std::string> words_to_use{
"crypt",  "by",     "my",     "cysts",  "glyph", "psych", "shyly",
"slyly",  "try",    "sylph",  "tryst",  "gypsy", "ply",   "pry",
"shy",    "sly",    "spy",    "thy",    "cry",   "sty",   "glyphs",
"sylphs", "trysts", "crypts", "psychs", "sprly"};

std::string phrase =
"[YYY] [YYYYY] [YYYBC] [GHLLLM] [PPPRR] [RS] [SS] [SSTTT]";
std::vector<long> chars_in_phrase(26, 0);
std::vector<long> phrase_word_length;

// Initializing the char used in the phrase and the word length of the
// phrase
unsigned int begin_idx = 0;
for (unsigned int idx = 0; idx < phrase.size(); idx++) {
char c = phrase[idx];
if (c == '[') {
begin_idx = idx;
} else if (c == ']') {
phrase_word_length.push_back(idx - begin_idx - 1);
} else if (c != ' ') {
chars_in_phrase[c - 'A']++;
}
}

// Sorting the words by size.
std::sort(words_to_use.begin(), words_to_use.end(),
[](const std::string& left, const std::string& right) {
if (left.size() == right.size())
return left < right;
return left.size() < right.size();
});

std::vector<std::string> phrase_solved;
solve_phrase(chars_in_phrase, phrase_word_length, words_to_use,
phrase_solved);

for (auto p : phrase_solved) {
std::cout << p << " ";
}
std::cout << std::endl;

return 0;
}

Выход получен: pry crypt gypsy trysts shyly by my slyly

0

По вопросам рекламы [email protected]