当前位置: 首页 > 知识库问答 >
问题:

数组组合和排列的C代码

南宫胡媚
2023-03-14

大家好,我对C编码很陌生,但我正在学习这门课程。

我想写一段代码,找出数组中r个元素的组合,然后对结果进行置换。

我已经能够从各种来源进行研究,并有单独的代码,将打印组合和排列的数组。

我面临的挑战是如何将两个代码结合起来并使其作为一个整体工作。

第一个代码用于 5 个元素数组的组合,其中一次选择 4 个元素。

/*C++ program to print all combination  of size r in an array of size n*/ 
#include <iostream> 
using namespace std; 
 
void combinationUtil(string arr[], string data[], 
                    int start, int end, 
                    int index, int r); 
 
/*The main function that prints all combinations of size r in arr[] of
  size n. This function mainly uses combinationUtil()*/
void printCombination(string arr[], int n, int r) 
{ 
    /*A temporary array to store all combination one by one*/
    string data[r]; 

    /*Print all combination using temporary array 'data[]'*/
    combinationUtil(arr, data, 0, n-1, 0, r); 
} 
 
/*arr[] ---> Input Array 
  data[] ---> Temporary array to 
  store current combination 
  start & end ---> Starting and
  Ending indexes in arr[] 
  index ---> Current index in data[] 
  r ---> Size of a combination to be printed */
void combinationUtil(string arr[], string data[], 
                    int start, int end, 
                    int index, int r) 
{ 
   
    if (index == r) 
    { 
        for (int j = 0; j < r; j++) 
            cout << data[j] << " "; 
        cout << endl; 
        return; 
    } 
 
    /*replace index with all possible elements. The condition "end-i+1 >= r-index"
      makes sure that including one element at index will make a combination
      with remaining elements at remaining positions*/
    for (int i = start; i <= end && 
        end - i + 1 >= r - index; i++) 
    { 
        data[index] = arr[i]; 
        combinationUtil(arr, data, i+1, 
                        end, index+1, r); 
    } 
} 
 
// Driver code 
int main() 
{ 
    string arr[] = {"Red", "Orange", "Green", "Blue", "Indigo"}; 
    int r = 4; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    printCombination(arr, n, r); 
} 

第二个代码是排列数组组合(前一个代码)的每个结果,这意味着4个元素的排列。在下面的这段代码中,使用了第一个代码的第一行结果的排列。

#include <iostream>
#include <string>
using namespace std;

// Function to display the array
void display(string a[], int n)
{
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }
    cout << endl;
}

// Function to find the permutations
void findPermutations(string a[], int n)
{
    // Sort the given array
    sort(a, a + n);

    // Find all possible permutations
    cout << "Possible permutations are:\n";
    do {
        display(a, n);
    } while (next_permutation(a, a + n));
}

// Driver code
int main()
{
    string a[] = { "Red", "Orange", "Green", "Blue"};
    int n = sizeof(a) / sizeof(a[0]);
    findPermutations(a, n);
    return 0;
}

总之,需要一个代码来查找单词数组的组合以及组合结果的每一行排列。

共有1个答案

乐正瑞
2023-03-14

你有两段代码,每一段都打印一些数据。你想连接它们。一种方法是更改一段代码,将数据存储在某种数据结构中,而不是打印。然后更改另一段代码以获得此数据结构,并处理其内容。

这就引出了数据结构的想法,C有std::向量,这是一个大小可变的数组,这是C中非常简单和最有用的数据结构,向量的元素可以有任何特定类型,包括向量,它允许使用嵌套列表(见下文)。

更改您的< code>printCombination函数以返回< code>std::vector而不是< code>void(同时适当更改其名称):

std::vector<std::vector<std::string>>
findCombinations(std::vector<std::string> strings, int r)
{
    ...
}

我省略了实现,因为我想在回答中专注于接口。

注意,这个函数的返回类型是< code>std::vector

然后更改您的查找排列以使用 std::vector 而不是数组接收其数据。

void findPermutations(std::vector<std::string> a)
{
   ...
}

(为简洁起见,我省略了引用传递)

然后让“driver”函数调用第一个函数,并将其输出传递给第二个函数:

// Driver code
int main()
{
    std::vector<std::string> arr{"Red", "Orange", "Green", "Blue", "Indigo"};
    int r = 4;
    auto combinations = findCombinations(arr, r);
    for (auto combination: combinations)
        findPermutations(combination);
}

(为了简洁起见,我省略了for循环中的引用传递)

 类似资料:
  • 问题 你想迭代遍历一个集合中元素的所有可能的排列或组合 解决方案 itertools模块提供了三个函数来解决这类问题。 其中一个是 itertools.permutations() , 它接受一个集合并产生一个元组序列,每个元组由集合中所有元素的一个可能排列组成。 也就是说通过打乱集合中元素排列顺序生成一个元组,比如: >>> items = ['a', 'b', 'c'] >>> from it

  • 排列 下一个排列 LeetCode - 31. 下一个排列 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5

  • 我试图从黑莓的本机日历中读取“day”值,该值以整数形式返回,并映射到一周中每一天的值。这些值如下所示: 周一:32768 星期二:16384 周三:8192 周四:4096 周五:2048 sat:1024 孙:65536 如果事件发生在一天内,我可以看到值是否为mon/tue/we/thu/fri/sat/sun 值也与星期一值相同。 现在的问题是,如果事件发生在两天或三天以上 返回所选天数的

  • 我做了一个代码,应该显示数组中元素排列的整个组合。 应该是什么: 123 213 231 132 312 321 但结果是这样的: 231 312 123 231 312 123 如何以应有的方式进行排列?

  • 本文向大家介绍C程序找到nCr和nPr.排列组合,包括了C程序找到nCr和nPr.排列组合的使用技巧和注意事项,需要的朋友参考一下 在C编程语言中,nCr被称为组合。nCr是从n个对象集中选择r个对象,其中对象的顺序无关紧要。 nPr称为置换。nPr是一组“ n”个对象中“ r”个对象的排列,其顺序或顺序应相同。 排列和组合公式 在C语言中找到给定数字的排列和组合的公式如下- nCr = n!/(

  • 本文向大家介绍java数组排列组合问题汇总,包括了java数组排列组合问题汇总的使用技巧和注意事项,需要的朋友参考一下 面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列; 2. 有重复元素的数组,求全排列; 3. 无重复元素的数组,求组合【子集】; 4. 有重复元素的数组,求组合; 以上四类题,可以用统一的模板实现,如下所示: 以