规定
用一个a[]数组代表一个母版,当然也是一个12选5的方案,然后用vis[]数组去存这12个数有没有被使用过,使用过了就设置为1,用path[]存储选出来的12选5方案,也就是path是动态变化的,a[]数组是一个母版,path在a的基础上来进行选择
代码
package test;
import java.util.Arrays;
/**
* 原始数据不动
* 这不是交换
* @author 仫佬首领
*
*/
public class Test {
static int a[] = {0,0,0,0,0,0,0,1,1,1,1,1};//每个排列代表一个12选5的方案(1就是要选的)
static int sum = 0;//计数有多少个方案
static int vis[]= {0,0,0,0,0,0,0,0,0,0,0,0};//记录被使用过了的数字
public static void f(int k,int path[]) {
if(k==12) {
sum++;
System.out.println(Arrays.toString(path));;
}
for(int i = 0;i<12;i++) {
if(i>0 && a[i]==a[i-1] && vis[i-1]==0) continue;//现在准备选取的元素和上一个元素相同,但是上一个元素还没有被使用
if(vis[i]==0) {//没有被用过的元素就可以抓取到path中
vis[i] = 1;//标记为已经访问
path[k] = a[i];//将a[i]填入path[i]中
f(k+1,path);//递归
vis[i] = 0;//回溯
}
}
}
public static void main(String[] args) {
int path[] = new int[] {0,0,0,0,0,0,0,0,0,0,0,0};
f(0,path);
System.out.println(sum);
}
}