您的位置:首页 > 其它

把一个数组里的数组合全部列出

2015-05-08 11:57 190 查看
题目:给一个数组arr,长度为n,找出从中取出r个数的所有组合。例如对于数组{1, 2, 3, 4} ,r = 2,则打印出:{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4} ,{3, 4}。

//============================================================================
// Name        : 所有组合.cpp
// Author      : Coder
// Version     :
// Copyright   : www.acmerblog.com
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>;
using namespace std;

void print(int arr[],int s,int e){
for(int i=s; i<=e; i++){
printf("%d ", arr[i]);
}
puts("");
}
/*
arr[] 输入数组, data[]保存当前的组合
start, end 剩余数组的起始位置
index 已经找到的组合数的个数
r 总共需要的组合数的个数
*/
void printAllCombination(int arr[],int data[],int start, int end,int index , int r){
//组合够r个就打印,并返回
if(index == r ){
for(int i=0; i<r; i++)
printf("%d ", data[i]);
puts("");
return;
}
//如果剩下的数组不够(r-index)个就直接返回。
if(start + (r-index) > end )
return;
data[index] = arr[start];//记录当前数据
printAllCombination(arr,data ,start+1, end, index+1, r);
printAllCombination(arr, data,start+1, end, index, r);
}
int main() {
int arr[] = {1,2,3,4,5};
int r = 3;
int * data = new int[r];//保持组合数
printAllCombination(arr,data, 0, sizeof(arr)/sizeof(arr[0]) ,0 ,r);
return 0;
}


来自:http://www.acmerblog.com/combinations-of-r-elements-6059.html

array数组:1 2 3 4 5

下标:0 1 2 3 4

data数组用来保存当前的r个值,index是在data中的下标

1. start=0,end=4,index=0,r==index不成立

data[0]=array[start]=1,向下递归(arr,data ,start+1, end, index+1, r),index和start都加1

(1)start=1,end=4,index=1,r==index不成立

data[1]=array[start]=2,向下递归(arr,data ,start+1, end, index+1, r),index和start都+1

1)start=2,end=4,index=2,r==index不成立

data[2]=array[start]=3

(arr,data ,start+1, end, index+1, r),index和start都+1,start=3,end=4,index=3 .........................(1.1)

a)r==index=3成立

所以将打印出当前data数组中的元素输出0-2下标的值,输出123,然后return到上一步,即回到了1)中(arr,data ,start+1, end, index+1, r)方法

向下执行

(arr,data ,start+1, end, index, r) 函数,start+1,index不变所以start=3,end=4,index=2 ...........................(1.2)

a)r==index(值为2)又不成立

data[2]=array[start]=4

(arr,data ,start+1, end, index+1, r),向下递归 ...........................1.3

A.此时start=4,end=4,index=3,r==index成立,打印出当前data中的值,输出124,然后return到1.3

(arr,data ,start+1, end, index, r) 函数执行 ,start+1=4,index=2

A.start=4,end=3,index=2,r==index不成立

(arr,data ,start+1, end, index+1, r) 向下递归,

r==index成立,输出125,然后return

(arr,data ,start+1, end, index, r) 超出数组下标,return
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: