public class Test { private int nCount; private boolean[] bUsed; private int r; private int[] print;
public Test(int n, int r) { nCount = n; this.r = r;
print = new int[n]; bUsed = new boolean[n];
// 初始化 for (int i = 0; i < n; i ++) { print[i] = 0; bUsed[i] = false; } }
public void permute(int pos) { int i; /*如果已是第r个元素了,则可打印r个元素的排列 */ if (pos==r) { for (i=0; i< r;i++) System.out.print(print[i]+1); System.out.println(); return; }
for (i=0; i<nCount;i++) if (!bUsed[i]) { /*如果第i个元素未用过*/ /*使用第i个元素,作上已用标记,目的是使以后该元素不可用*/ bUsed[i] = true ; /*保存当前搜索到的第i个元素*/ print[pos] = i; /*递归搜索*/ permute(pos+1);
/*恢复递归前的值,目的是使以后改元素可用*/ bUsed[i] = false; } }
public static void main(String[] args) { Test t = new Test(5,3); // 若要全排列,换做 new Test(5,5)
t.permute(0); } }
public Test(int n, int r),如果全排列的话,r与n不就是一样的吗?
排列组合的思想. 上面实现的是,如果有n个数,提取出r个数,总共会有几种排列方法. 如果要全排列,那么r = n.
public class Test
{
private int nCount;
private boolean[] bUsed;
private int r;
private int[] print;
public Test(int n, int r)
{
nCount = n;
this.r = r;
print = new int[n];
bUsed = new boolean[n];
// 初始化
for (int i = 0; i < n; i ++)
{
print[i] = 0;
bUsed[i] = false;
}
}
public void permute(int pos)
{
int i;
/*如果已是第r个元素了,则可打印r个元素的排列 */
if (pos==r) {
for (i=0; i< r;i++) System.out.print(print[i]+1);
System.out.println();
return;
}
for (i=0; i<nCount;i++)
if (!bUsed[i]) { /*如果第i个元素未用过*/
/*使用第i个元素,作上已用标记,目的是使以后该元素不可用*/
bUsed[i] = true ;
/*保存当前搜索到的第i个元素*/
print[pos] = i;
/*递归搜索*/
permute(pos+1);
/*恢复递归前的值,目的是使以后改元素可用*/
bUsed[i] = false;
}
}
public static void main(String[] args)
{
Test t = new Test(5,3); // 若要全排列,换做 new Test(5,5)
t.permute(0);
}
}
上面实现的是,如果有n个数,提取出r个数,总共会有几种排列方法.
如果要全排列,那么r = n.