【问题标题】:Generating all the permutations of two digits of equal number生成两位数相等的所有排列
【发布时间】:2013-08-01 13:55:42
【问题描述】:

这里给定了两个数量相等的数字 1 和 0。现在我试图找到它的可能排列。像这样假设我给了 2 个 1 和 2 个 0。我从这个 0011 开始。然后我将第一个 1 沿左侧移动,生成 0101,然后 1001。现在我移动第二个 1,生成 1010 和 1100。这种方法是否有效。我缺少 0110,我不知道该怎么做。我想有像递归回溯这样的方法来做到这一点。但我不知道回溯的技术。我确实了解递归。所以谁能告诉我方法吗?迭代或递归。如果可能,两者都可以。 我试图找到所有可能的排列。对于 2 个 1 和 0,它是 1001,1100,1010,0101,0110,0011。这是 4!/(2!*2!) 排列。我该如何做更多,例如 111000 或 11110000 ?语言是 C++。为了澄清起见,它可以是任何字符,如 ooii 或 kkjj。那应该是我正在操作的字符串

【问题讨论】:

标签: permutation backtracking


【解决方案1】:

这听起来像是一个家庭作业问题(如果我错了,请纠正我),所以我将提供一些伪代码来说明一般方法。您必须弄清楚如何调整算法以在 C++ 中工作(并希望在此过程中理解它)。

这个想法是获取每个字符并将其附加到剩余字符的每个排列中,递归。基本情况是空字符串。

function foo (List<char> chars)
    List<string> permutations = new List<string>()
    for i:0..chars.length - 1
        List<string> subPermutations = foo(chars.removeAt(i))
        for each string perm in subPermutations
            permutations.add(chars.get(i) + perm)
        end for
    end for
    if permutations is empty
        permutations.add("")
    end if
    return permutations
end foo

作为补充说明,当您专门处理重复的 2 个不同字符时,这会给您带来很多重复的排列。您的选择是在将排列添加到列表之前检查是否已经生成了排列,在最后从列表中删除重复项,或者针对您的情况优化递归。

【讨论】:

  • :D 实际上它不是作业。这是一个竞赛问题,uva.onlinejudge.org/…
  • 我认为同样可以省略完整的解决方案。但希望足以让您走上正轨。
【解决方案2】:

阅读您喜欢的语言的排序算法。以下是对排序类型的一些描述:

https://en.wikipedia.org/wiki/Sorting_algorithm

我不知道你在说什么。

【讨论】:

  • 我知道排序类型算法。但我该如何联系?我不想在这里排序
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2012-05-03
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多