在 C++ 中创建蛮力算法 [关闭]

Posted

技术标签:

【中文标题】在 C++ 中创建蛮力算法 [关闭]【英文标题】:Creating a brute-force algorithm in C++ [closed] 【发布时间】: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(虽然我的措辞有点令人困惑) 【参考方案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;

【讨论】:

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

以上是关于在 C++ 中创建蛮力算法 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

算法设计与分析--求最大子段和问题(蛮力法分治法动态规划法) C++实现

如何在 C++ 中使用约束满足来实现密码算法

字符串字符串查找 ( 蛮力算法 )

算法——蛮力法之顺序查找和蛮力字符串匹配

为啥分而治之的算法通常比蛮力运行得更快?

运行蛮力算法出错?