java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?相关的知识,希望对你有一定的参考价值。
此题参考与其他人思路, 2个解题方式。
1.
1 /** 2 * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 3 * 状态树方式解 4 * 用状态生成树的方式来做的,先把12个人按从低到高一次编号, 5 * 从(1 ; 2)出发,加入3和4的时候生成(1,3 ; 2,4)和(1,2 ; 3,4), 6 * 然后加入5和6,分别从前面的两个状态出发,可以生成5种状态,就是说6个人时有5种排列 7 * @author amos-s 8 * @Time:2017年3月10日 下午6:18:37 9 * @version 1.0 10 */ 11 public class LineUpProblem { 12 13 private int count = 0; 14 private int total = 0; 15 private Stack<Integer> place = new Stack<Integer>(); 16 17 public LineUpProblem(int total) { 18 this.total = total; 19 } 20 21 private void lineOrder(int order, int level) { 22 place.push(order); 23 if (level >= total / 2) { 24 count++; 25 for (Integer integer : place) { 26 System.out.print(integer); 27 } 28 System.out.println(); 29 place.pop(); 30 return; 31 } 32 33 for (int i = order + 1; i < 2 * (level + 1); ++i) { 34 lineOrder(i, level); 35 } 36 place.pop(); 37 } 38 39 40 public void lineOrder() { 41 lineOrder(1, 1); 42 System.out.println("第一排一共有" + count + "种排列"); 43 } 44 45 public static void main(String[] args) { 46 LineUpProblem line = new LineUpProblem(12); 47 line.lineOrder(); 48 } 49 }
2.
1 /** 2 * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 3 * 1.目前数是{0,1,2,3,4,5}, ++操作后,数变为{0,1,2,3,4,6},因为6小于且等于位置5的最大值2n = 10,所以此组合是个符合要求的组合。 4 5 * 2.又如目前数是{0,1,2,3,4,10}, ++操作后,数变为{0,1,2,3,4,11},因为11大于位置5的最大值2n = 10, 6 因此要进位,这样位置4的数++,再检查位置4的数++后是5,小于且等于位置4的最大值2n = 8,这个位置符合条件, 7 而位置5的数要置"0",这个0不能是再从范围的起始值开始,而是要等于位置4的数+1.因为从起始值开始的数肯定是小于位置4的值的。 8 9 * 3.以此类推,如果目前数是{0,1,4,6,8,10},++操作后,需要进位,一步一步往前进位,最终进位位置1的数,数就变成了{0,2,5,7,9,11}, 10 然后要把位置1之后位置的每个位置的数置"0", 等于前一个位置的数+1,这样最后数就是{0,2,3,4,5,6}. 11 12 * 4.检查此数组合是否符合条件是,检查最后一个数是否小于且等于其位置的最大值。 13 * 14 * @author amos-s 15 * @Time:2017年3月10日 下午6:18:37 16 * @version 1.0 17 */ 18 public class LineUpProblem2 { 19 20 private int count = 0; 21 private int total = 0; 22 23 public LineUpProblem2(int total) { 24 this.total = total; 25 } 26 27 private void lineOrder() { 28 //No.1 29 //开始写代码,求排列方式有多少种 30 if (total % 2 != 0) 31 return; 32 //初始化数组,并完成第一种排列 33 int[] data = new int[total / 2]; 34 for (int i = 1; i < data.length; ++i) { 35 data[i] = i; 36 } 37 count++; 38 //保存操作数组的位置 39 int i = data.length - 1; 40 int allCount = 0; 41 while (i >= 0) { 42 43 data[i]++; //要操作的数+1 44 if (data[i] <= i * 2) { 45 //对其数后面的数字初始化 46 for (int j = i + 1; j < data.length; ++j) { 47 data[j] = data[j - 1] + 1; //保证其是前一位+1,最小数组合 48 } 49 } else { 50 //此位置已达最大值,操作其前面一位 51 i--; 52 continue; 53 } 54 //检查最后一位的数是否小于且等于其位置的最大值,如果是的话,此数组合符合要求 55 System.out.println(data[data.length - 1]); 56 if (data[data.length - 1] <= data[data.length - 1] * 2) { 57 count++; //排列方式+1 58 // 把++操作的数的位置置回最后一个位置。 59 i = data.length - 1; 60 } else { 61 // 如果大于其位置的最大值,说明已遍历完毕,超过了此数组合的最大值。 62 break; 63 } 64 65 } 66 67 68 //end_code 69 } 70 71 public void lineOrder() { 72 lineOrder(); 73 System.out.println("第一排一共有" + count + "种排列"); 74 } 75 76 public static void main(String[] args) { 77 LineUpProblem2 line = new LineUpProblem2(12); 78 line.lineOrder(); 79 } 80 }
以上是关于java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试 - 高矮个子排队(Java) | 机试题+算法思路+考点+代码解析 2023