【问题标题】:Creating a brute-force algorithm in C++ [closed]在 C++ 中创建蛮力算法 [关闭]
【发布时间】:2017-07-31 19:09:45
【问题描述】:

我正在尝试用 C++ 制作一个蛮力算法来解决问题。我之前在 Python 中制作了一个蛮力算法,但这使用了第 3 方库,这意味着我无法将其转换为 C++。我很喜欢我发现的这个设计;

#include <iostream>

using namespace std;

int main() {
    string characters = "abcde";

    int length = 5;
    string word = "";
    for(int i = word.length(); i <= length; i++) {
        for(int l = 0; l < characters.length(); l++) {
            word += characters[l];
            cout << word << "\n";
        }
    }
    return 0;
}

,但由于一些错误,它的输出是:

abcdeabcde
abcdeabcdea
abcdeabcdeab
abcdeabcdeabc
abcdeabcdeabcd
abcdeabcdeabcde

等等…… 结果,我需要的是:

a
b
c
d
e
aa
ab
ac
ad
ae
ba
bb
bc
...

提前致谢:)

任何帮助表示赞赏:)

【问题讨论】:

  • 这不是你代码的输出
  • 你想对该字符串进行所有可能的排列等等......
  • 您没有每次都遍历字符串。我会为此使用一个字符数组。
  • 这个问题更好的措辞是:“我想在给定字母表的语言中生成所有单词”en.wikipedia.org/wiki/Formal_language(虽然我的措辞有点令人困惑)

标签: c++ algorithm c++11 brute-force


【解决方案1】:

您生成所有排列的方法存在根本缺陷。即使您的代码中的错误已修复,它也不会按照您想要的方式运行。

简单地说,使用 2 级循环,您永远不会遇到“aaa”排列。

我个人会推荐一种递归方法,这是一个您可以解决的粗略起点:

#include <iostream>
#include <string>

void visit(std::string const& chars, size_t max_len, std::string const& cur) {
    if(cur.length() == max_len) {
      return;
    }
    else {
      for(auto c : chars) {
        std::string next = cur + c;
        std::cout << next << std::endl;

        visit(chars, max_len, next);
      }
    }
}

int main() {
  visit("abcde", 5, "");
  return 0;
}

【讨论】:

  • 我非常喜欢这种递归方法:)
  • 我不是那种抄袭别人的作品并声称是我自己的人,我喜欢自己编程和学习,但我一无所知。谢谢朋友,这真的很有帮助!我不经常使用堆栈溢出,我如何给你声望分?
  • 只需将我的答案标记为已接受 (stackoverflow.com/help/someone-answers)。很高兴能帮上忙。
  • 这取决于版本 (msdn.microsoft.com/en-us/library/hh567368.aspx)。我正在使用的功能称为“基于范围的 for-loop”。根据该矩阵,它是在 MSVC 2012 中引入的。
  • 更改我的代码以使用传统的 for 循环非常简单。我相信你可以从这里拿走它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
相关资源
最近更新 更多