有六个数,分别是1,2,2,3,4,5,要求列出所有的六位数,3不能在第三位,4和5不能相连,要把所有的六位数列出来
最直接最笨的办法:定义一个int[6]表示六个位子,我们先放有条件限制的,4、5、3
4可能放在六位的一个,所以一个循环
5可能放在六位的一个,所以再嵌一个循环,但此时要加限制了,不能和4重复或前后
3可能放在六位的一个,要一个循环,加限制,不能和4、5同位且不能在第三位
1可能放在剩下的三位的一个,也要用一个循环
2放在剩下的两位,成功一个输出一个,
基于以上思想,我们定义的数组初始化都为0
public class SixNumber {
public static void main(String[] agrs){
int array[] = new int[]{0,0,0,0,0,0};//初始化六个位子
int count=0; //统计总的符合情况数
for(int i=0;i<6;i++){ //第一个循环存放4
array[i]=4;
for(int j=0;j<6;j++){ //第二个循环存放5
if(j!=i&&j!=i-1&&j!=i+1){ //加限制
array[j]=5;
for(int k=0;k<6;k++){ //第三个循环存放3
if(k!=i&&k!=j&&k!=2){ //加限制
array[k]=3;
for(int m=0;m<6;m++){ //第四个循环存放1
if(m!=i&&m!=j&&m!=k){ //加限制
array[m]=1;
for(int t=0;t<6;t++){ //剩下的循环就是打印出来符合的情况了
if(array[t]==0){ //为0的当然是剩下的两个位子了,我们不要设置了,直接打印出2就行了
System.out.print(2);
}else{
System.out.print(array[t]); //此位不为0就打印出对应存放好的值就行了
}
if(t==5){
count++;//符合情况的
if(count%5==0)
System.out.println(); //一种符合情况后换行
else
System.out.print("---------");
}
}
array[m]=0; //这里要恢复上一层,以便下一个再试
}
}
array[k]=0;//这里要恢复上一层,以便下一个再试
}
}
array[j]=0;//这里要恢复上一层,以便下一个再试
}
}
array[i]=0;//这里要恢复上一层,以便下一个再试
}
System.out.println("\n共"+count+"中符合情况的");
}
}
public class test{
private int[] numbers = new int[] { 1, 2, 2, 3, 4, 5 };
public int n;
private String lastResult = "";
private boolean validate(String s) {
if (s.compareTo(lastResult) <= 0)
return false;
if (s.charAt(2) == '3')
return false;
if (s.indexOf("45") >= 0 || s.indexOf("54") >= 0)
return false;
return true;
}
public void list(String index, String result) {
for (int i = 0; i < numbers.length; i++) {
if (index.indexOf(i + 48) < 0) {
String s = result + String.valueOf(numbers[i]);
if (s.length() == numbers.length) {
if (validate(s)) {
System.out.println(s);
lastResult = s; n++;
}
break;
}
list(index + String.valueOf(i), s);
}
}
} public static void main(String[] args) {
test1 t = new test1();
t.list("", "");
System.out.println("总数:" + t.n);
}
}
[code="java"]
public class Permutation {
/**
* 测试
* @param args
*/
public static void main(String[] args) {
String s = "122345";//这里是要用到的所有数组成的一个字符串,其它字符同样适用
char[] c = s.toCharArray();
new Permutation().permutation(c, c.length, 0);
System.out.println("可能的组合数:" + count);
}
/*组合计数器*/
static int count = 0;
/**
* 排列组合
* @param array
* @param n
* @param k
*/
private void permutation(char[] array, int n, int k) {
if (n == k) {
if (array[2] != '3') {//第三个位置不能出现3
String str = new String(array);
if (str.indexOf("45") < 0 && str.indexOf("54") < 0) {//4,5不能连续出现
System.out.println(str);
++count;
}
}
} else {
for (int i = k; i < n; i++) {
exchange(array, k, i);
permutation(array, n, k + 1);
exchange(array, i, k);
}
}
}
/**
* x,y互换
* @param a
* @param x
* @param y
*/
private void exchange(char[] a, int x, int y) {
char temp = a[x];
a[x] = a[y];
a[y] = temp;
}
}
[/code]
运行结果:
435122---------435212---------435221---------415322---------425312
425321---------415232---------425132---------425231---------415223
425123---------425213---------431522---------432512---------432521
412532---------421532---------422531---------412523---------421523
422513---------431252---------432152---------432251---------412352
421352---------422351---------412253---------421253---------422153
431225---------432125---------432215---------412325---------421325
422315---------412235---------421235---------422135---------341522
342512---------342521---------142532---------241532---------242531
142523---------241523---------242513---------341252---------342152
342251---------142352---------241352---------242351---------142253
241253---------242153---------341225---------342125---------342215
142325---------241325---------242315---------142235---------241235
242135---------534122---------534212---------534221---------514322
524312---------524321---------514232---------524132---------524231
514223---------524123---------524213---------314252---------324152
324251---------134252---------234152---------234251---------124352
214352---------224351---------124253---------214253---------224153
314225---------324125---------324215---------134225---------234125
234215---------124325---------214325---------224315---------124235
214235---------224135---------531422---------532412---------532421
512432---------521432---------522431---------512423---------521423
522413---------351422---------352412---------352421---------152432
251432---------252431---------152423---------251423---------252413
312425---------321425---------322415---------132425---------231425
232415---------122435---------212435---------221435---------531242
532142---------532241---------512342---------521342---------522341
512243---------521243---------522143---------351242---------352142
352241---------152342---------251342---------252341---------152243
251243---------252143---------315242---------325142---------325241
135242---------235142---------235241---------125342---------215342
225341---------125243---------215243---------225143---------531224
532124---------532214---------512324---------521324---------522314
512234---------521234---------522134---------351224---------352124
352214---------152324---------251324---------252314---------152234
251234---------252134---------315224---------325124---------325214
135224---------235124---------235214---------125324---------215324
225314---------125234---------215234---------225134---------312524
321524---------322514---------132524---------231524---------232514
122534---------212534---------221534---------
共198中符合情况的