所以目前我有一个长度为偶数的数组int arr[]
。我的问题是,我试图将每个元素与另一个元素配对到Mapunordered_map <int, int> pairs
中。只要arr[]
的大小大于2,就有多种可能性。我需要的是生成所有可能的配对集。
为了阐明这一目标,下面是一个示例:
int arr[4] = {1, 2, 3, 4};
如果这是数组,那么map可以有这些对:
pairs = {{1, 2}, {2, 1}, {3, 4}, {4, 3}};//1 and 2, 3 and 4
pairs = {{1, 3}, {3, 1}, {2, 4}, {4, 2}};//1 and 3, 2 and 4
pairs = {{1, 4}, {4, 1}, {2, 3}, {3, 2}};//1 and 4, 2 and 3
对于这些类型的问题,我自动选择了递归方法,让无限数量的嵌套循环通过每一对,将它们标记为已经配对,并进入下一级循环。然而,一些尝试证明这项任务超出了我的能力。有人能帮我吗?
我的代码:
#include <iostream>
#include <deque>
#include <unordered_map>
int n = 4;
std::unordered_map <int, int> pairs;
std::deque <int> arr = {0, 1, 2, 3};
std::deque <bool> paired = {false, false, false, false};
bool finishedPairing() {
for (int i = 0; i < n; i++) {
if (paired[i] == false) { return false; }
}
return true;
}
void pairUp() {
if (finishedPairing()) {
std::cout << "\nNew Set:\n";
for (int i = 0; i < 4; i++) {
std::cout << i << " is paired with " << pairs[i] << '\n';
}
return;
}
//what I need written as C++ code
}
int main () {
pairUp();
return 0;
}
在我手动执行pairUp()
之后,应该得到的输出是:
New Set:
0 is paired with 1
1 is paired with 0
2 is paired with 3
3 is paired with 2
New Set:
0 is paired with 2
1 is paired with 3
2 is paired with 0
3 is paired with 1
New Set:
0 is paired with 3
1 is paired with 2
2 is paired with 1
3 is paired with 0
1条答案
按热度按时间bvjxkvbb1#
当我意识到我可以为每次递归运行选择第一个非配对数,并循环遍历其他可能的第二项,将第一项与第一项配对并重复,直到所有项配对时,我发现了解决方案。还有一个错误。由于
arr[]
中的元素可能不会从0开始递增1,因此代码中的某些i
和j
应该变为arr[i]
和arr[j]
。全篇:
测试结果: