排列组合算法
2007-06-09 19:52
253 查看
采用递归、回溯方法:
//排列组合
private static void combine(int n)...{
boolean[] selected=new boolean
;
Arrays.fill(selected, false);
int[] v=new int
;
Arrays.fill(v, -1);
doCombine(selected,v,n,0);
}
//selected 已选择标识
//filledCount 已填充个数
private static void doCombine(boolean[] selected, int[] v, int n, int filledCount)...{
for(int i=filledCount;i<n;i++)...{
for(int j=0;j<n;j++)...{
if(!selected[j])...{
selected[j]=true;
v[i]=j+1;
if(i==n-1)...{
dumpIfFullFilled(v);
}
doCombine(selected,v,n,i+1);
//回溯
selected[j]=false;
v[i]=-1;
}
}
}
}
private static void dumpIfFullFilled(int[] v)...{
String s="";
for(int i=0;i<v.length;i++)...{
if(v[i]==-1)...{
return;
}
s+=v[i]+" ";
}
System.out.println(s);
}
测试
combine(4);
输出
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
//排列组合
private static void combine(int n)...{
boolean[] selected=new boolean
;
Arrays.fill(selected, false);
int[] v=new int
;
Arrays.fill(v, -1);
doCombine(selected,v,n,0);
}
//selected 已选择标识
//filledCount 已填充个数
private static void doCombine(boolean[] selected, int[] v, int n, int filledCount)...{
for(int i=filledCount;i<n;i++)...{
for(int j=0;j<n;j++)...{
if(!selected[j])...{
selected[j]=true;
v[i]=j+1;
if(i==n-1)...{
dumpIfFullFilled(v);
}
doCombine(selected,v,n,i+1);
//回溯
selected[j]=false;
v[i]=-1;
}
}
}
}
private static void dumpIfFullFilled(int[] v)...{
String s="";
for(int i=0;i<v.length;i++)...{
if(v[i]==-1)...{
return;
}
s+=v[i]+" ";
}
System.out.println(s);
}
测试
combine(4);
输出
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
相关文章推荐
- 算法:C++排列组合
- 字符串的全排列和组合算法
- [互联网面试笔试汇总C/C++-11] 字符串全排列和组合算法
- 算法笔记--排列组合
- 排列组合算法
- 字符串的全排列和组合算法
- C#实现排列组合算法
- [经典算法] 排列组合-N元素集合的所有子集(一)
- java排列组合算法代码实现
- java排列组合算法代码实现
- python算法习题(一): 排列组合
- 高效率的排列组合算法
- 全排列算法与全组合算法
- 排列组合算法(Java)
- 算法 全排列问题,组合问题,子集问题
- C语言实现的排列组合问题的通用算法、解决方法
- 基础算法之排列组合生成算法
- 组合排列、全排列 面试算法(5)
- 【算法总结-排列组合与子集问题】排列组合与子集问题
- 【OI之路】02数论算法-3排列与组合