/*问题:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
解答的大牛,希望给出思路和给出代码的注释谢谢*/
//此题已经完毕,现在上传结果 运行下就OK了
//此题思路:
/*
* 先打印两位的排列方式,然后去掉3和5相连的情况,然后在第二位的基础上去确定第三位,在去掉3和5相连的情况。。。。。。。。。
* 第三位不能有4:直接在第三个for中,此题即第三个位置,把a3[x3]中位置是4的情况去掉即可,此时第四位就不会再有4了
*/
public class aa
{
public static void main(String[] args)
{
String[] a1 = new String[]{"1","2","2","3","4","5"};
String[] a2 = new String[]{"1","2","2","3","4","5"};
String[] a3 = new String[]{"1","2","2","3","4","5"};
String[] a4 = new String[]{"1","2","2","3","4","5"};
String[] a5 = new String[]{"1","2","2","3","4","5"};
String[] a6 = new String[]{"1","2","2","3","4","5"};
String s1 = null;
String s2 = null;
String s3 = null;
String s4 = null;
String s5 = null;
String s6 = null;
//s1到s6表示的都是每个数的位置
//x1到x6表示的是数组的元素角标
//每个for循环语句代表一位数
int count =0;//记录排列的种数
for(int x1 = 0;x1<a1.length;x1++)//用1和下面的每一位组合一次
{
s1 = a1[x1]; //第一位字符
for(int x2 = 0;x2<a2.length;x2++)//用2和下面的每一位组合一次
{
if(x1==3 && x2==5){continue;} //如果第四位和第六位相连,即;3和5相连,那么就不打印,而是进入下一次循环
if(x1!=x2) //a1的角标和a2的角标不能相同,即:如果a1[0]==1,那么a2[0]==1时就不组合,以下以此类推
{
s2 = s1+ a2[x2]; //前两位字符就等于第一位+第二位,此处是字符串连接
for(int x3 = 0;x3<a3.length;x3++)
{
if(a3[x3].equals("4")){continue;} //如果第三位的角标是4,那么也跳过,进入下一次循环
if(x2==3 && x3==5){continue;}//如果3和5相连,那么就不打印,进入下一次循环
if(x1!=x2 && x1!=x3 && x2!=x3)//a1,a2,a3的角标各不相同才组合
{
s3 = s2+ a3[x3];//前三位字符就等于第一位+第二位+第三位,此处是字符串连接,以下以此类推
for(int x4 = 0;x4<a4.length;x4++)
{
if(x3==3 && x4==5){continue;}//如果3和5相连,那么就不打印,进入下一次循环
if(x1!=x2 && x1!=x3 && x1!=x4 &&x2!=x3 &&x2!=x4 && x3!=x4 )//a1,a2,a3,a5的角标各不相同才组合
{
s4 = s3+ a4[x4];
for(int x5 = 0;x5<a5.length;x5++)
{
if(x4==3 && x5==5){continue;}//如果3和5相连,那么就不打印,进入下一次循环
if(x1!=x2 && x1!=x3 && x1!=x4 && x1!=x5 &&x2!=x3 &&x2!=x4 && x2!=x5 && x3!=x4 &&x3!=x5)
{
s5 = s4+ a5[x5];
for(int x6 = 0;x6<a6.length;x6++)
{
if(x5==3 && x6==5){continue;}//如果3和5相连,那么就不打印,进入下一次循环
if(x1!=x2 && x1!=x3 && x1!=x4 && x1!=x5 && x1!=x6 &&x2!=x3 &&x2!=x4 && x2!=x5 &&x2!=x6 && x3!=x4 &&x3!=x5 && x3!=x6 && x4!=x5 &&x4!=x6&& x5!=x6)
{
s6 = s5+ a6[x6];
System.out.println(s6);//此时六位数已经确定,打印咯。。。
count++;
}
}
}
}
}
}
}
}
}
}
}
System.out.println("排列方式总共有:"+count+"种");
}
}
//此题本人花着上课的时间做的哦,做了好久啊个么,
//此题乍一看可能不好看懂,但是你从里面往外剥,不难理解,如下:
/*for(int x1 = 0;x1<a1.length;x1++)//用1和下面的每一位组合一次
{
s1 = a1[x1]; //第一位字符
for(int x2 = 0;x2<a2.length;x2++)//用2和下面的每一位组合一次
{
if(x1==3 && x2==5){continue;} //如果第四位和第六位相连,即;3和5相连,那么就不打印,而是进入下一次循环
if(x1!=x2) //a1的角标和a2的角标不能相同,即:如果a1[0]==1,那么a2[0]==1时就不组合,以下以此类推
{
s2 = s1+ a2[x2];
System.out.println(s2); //打印2个数的情况
}
}
}
}
}
*/
个么,求积分啊{:soso_e183:} |