求从n个数组任意选取一个元素的所有组合
生活随笔
收集整理的這篇文章主要介紹了
求从n个数组任意选取一个元素的所有组合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
求從n個數組任意選取一個元素的所有組合,對于這個問題,我們在直觀上感覺很容易,但是用程序實現時則發現用for循環解決不了問題,因為n是隨意的。
在這里,我們用遞歸的思想,對于數據[1, 3, 4]; [2, 5]; [6, 7];我們可以 1.將1,2,6壓入棧中,然后輸出棧中所有元素,之后彈出6
2.壓入7,輸出棧中所有元素,之后彈出7
3.彈出2,壓入5,再壓入6,然后輸出棧中所有元素,之后彈出6
4.壓入7,輸出棧中所有元素,之后彈出7
以此類推,即可得到所有組合。
具體程序實現如下:#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void get_result_in_vector(vector<vector<int> > & vec,int N,vector<int> &tmp, vector<vector<int>>& tmp_result)
{
for(int i = 0;i<vec[N].size();++i)
{
tmp.push_back(vec[N][i]);
if (N<vec.size()-1)
{
get_result_in_vector(vec,N+1,tmp, tmp_result);
}
else
{
vector<int> one_result;
for (int i = 0;i<tmp.size();++i)
{
one_result.push_back(tmp.at(i));
}
tmp_result.push_back(one_result);
}
tmp.pop_back();
}
}
void get_all_combination(vector<vector<int>>& vec, int result[][3])
{
vector<int> tmp_vec;
vector<vector<int>> tmp_result;
get_result_in_vector(vec,0,tmp_vec, tmp_result);
//將vector中的數據轉化為數組保存
for (int i = 0; i < tmp_result.size(); i++)
{
for (int j = 0; j < tmp_result.at(i).size(); j++)
{
result[i][j] = tmp_result.at(i).at(j);
}
}
}
int main()
{
int arr1[] = {1, 3, 4};
int arr2[] = {2, 5};
int arr3[] = {6, 7};
const int first_dimension = sizeof(arr1)/sizeof(arr1[0]) * sizeof(arr2)/sizeof(arr2[0]) * sizeof(arr3)/sizeof(arr3[0]);
//所有組合的結果
int result[first_dimension][3];
vector<vector<int>> vec;
vec.push_back(vector<int>(arr1,arr1+sizeof(arr1)/sizeof(arr1[0])));
vec.push_back(vector<int>(arr2,arr2+sizeof(arr2)/sizeof(arr2[0])));
vec.push_back(vector<int>(arr3,arr3+sizeof(arr3)/sizeof(arr3[0])));
get_all_combination(vec, result);
//輸出結果
for (int i = 0; i < first_dimension; i++)
{
for (int j = 0; j < 3; j++)
{
cout<<result[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
在這里,我們用遞歸的思想,對于數據[1, 3, 4]; [2, 5]; [6, 7];我們可以 1.將1,2,6壓入棧中,然后輸出棧中所有元素,之后彈出6
2.壓入7,輸出棧中所有元素,之后彈出7
3.彈出2,壓入5,再壓入6,然后輸出棧中所有元素,之后彈出6
4.壓入7,輸出棧中所有元素,之后彈出7
以此類推,即可得到所有組合。
具體程序實現如下:#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void get_result_in_vector(vector<vector<int> > & vec,int N,vector<int> &tmp, vector<vector<int>>& tmp_result)
{
for(int i = 0;i<vec[N].size();++i)
{
tmp.push_back(vec[N][i]);
if (N<vec.size()-1)
{
get_result_in_vector(vec,N+1,tmp, tmp_result);
}
else
{
vector<int> one_result;
for (int i = 0;i<tmp.size();++i)
{
one_result.push_back(tmp.at(i));
}
tmp_result.push_back(one_result);
}
tmp.pop_back();
}
}
void get_all_combination(vector<vector<int>>& vec, int result[][3])
{
vector<int> tmp_vec;
vector<vector<int>> tmp_result;
get_result_in_vector(vec,0,tmp_vec, tmp_result);
//將vector中的數據轉化為數組保存
for (int i = 0; i < tmp_result.size(); i++)
{
for (int j = 0; j < tmp_result.at(i).size(); j++)
{
result[i][j] = tmp_result.at(i).at(j);
}
}
}
int main()
{
int arr1[] = {1, 3, 4};
int arr2[] = {2, 5};
int arr3[] = {6, 7};
const int first_dimension = sizeof(arr1)/sizeof(arr1[0]) * sizeof(arr2)/sizeof(arr2[0]) * sizeof(arr3)/sizeof(arr3[0]);
//所有組合的結果
int result[first_dimension][3];
vector<vector<int>> vec;
vec.push_back(vector<int>(arr1,arr1+sizeof(arr1)/sizeof(arr1[0])));
vec.push_back(vector<int>(arr2,arr2+sizeof(arr2)/sizeof(arr2[0])));
vec.push_back(vector<int>(arr3,arr3+sizeof(arr3)/sizeof(arr3[0])));
get_all_combination(vec, result);
//輸出結果
for (int i = 0; i < first_dimension; i++)
{
for (int j = 0; j < 3; j++)
{
cout<<result[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
轉載于:https://www.cnblogs.com/null00/archive/2011/06/15/2081552.html
總結
以上是生活随笔為你收集整理的求从n个数组任意选取一个元素的所有组合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle怎样把查询的null转换为0
- 下一篇: 这哥们水晶报表不错