【Java/算法/排列】列举出由1,2,3,4,5,6组成的,没有重复数字,且1,3都不与5相邻的六位偶数?

【题干】

由1,2,3,4,5,6组成的,没有重复数字,且1,3都不与5相邻的六位偶数的个数是?(此题为10年四川高考理科第10题)

【数学解答】

末位是246选1,其余全排列,总数是C31A55=360种;(C31表示三中选一,A55表示5个全排列)

相邻即捆绑,捆绑比不相邻更容易考虑;

假设末位为6,1,5捆绑后与2,3,4全排,1,5内部有两种排列方式,有C31A44A22种;

同理3,5捆绑有C31A44A22种;

假设末位为6,把5放13中间与2,4去安排,135内部有531,135两种形式,有C31A33A22种;

Sum=C31A55-2*C31A44A22+C31A33A22=108种;

【程序解答】

总数计有360种,全排为720种,用条件筛选掉奇数和15,35相邻的就行;

代码:

import java.util.ArrayList;
import java.util.List;

public class Arrange3 {
    static List<List<Integer>> results = new ArrayList<>();
    
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6};
  
        Arrange3 h1 = new Arrange3();
        h1.dfs(arr,new ArrayList<>());
        
        int idx=0;
        for (List<Integer> currLs : results) {
            
            // 1.奇偶间隔校验
            int first=currLs.get(0);
            int second=currLs.get(1);
            int third=currLs.get(2);
            int forth=currLs.get(3);
            int fifth=currLs.get(4);
            int sixth=currLs.get(5);
            
            // 1.偶数校验
            if(sixth%2!=0) {
                continue;
            }
            
            // 2.1,3都不与5相邻捆绑校验
            if(first==5) {
                if(second==1 || second==3) {
                    continue;
                }
            }
            if(sixth==5) {
                if(fifth==1 || fifth==3) {
                    continue;
                }
            }
            
            boolean flag=false;
            for(int i=1;i<6;i++) {
                if(currLs.get(i)==5) {
                    if(currLs.get(i-1)==1 || currLs.get(i+1)==3 || currLs.get(i-1)==3 || currLs.get(i+1)==1) {
                        flag=true;
                        break;
                    }
                }
            }
            
            if(flag) {
                continue;
            }
            
            
            System.out.println(String.format("%02d",++idx)+"."+currLs);
        }  
    }
  
    public List<List<Integer>> dfs( int[] arr,List<Integer> list){
        List<Integer> temp = new ArrayList<>(list);
        if (arr.length == list.size()){
            results.add(temp);
        }
        for (int i=0;i<arr.length;i++){
            if (temp.contains(arr[i])){
                continue;
            }
            temp.add(arr[i]);
            dfs(arr,temp);
            temp.remove(temp.size()-1);
        }
        return results;
    }
}

【输出】

01.[1, 2, 3, 4, 5, 6]
02.[1, 2, 3, 6, 5, 4]
03.[1, 2, 5, 4, 3, 6]
04.[1, 2, 5, 6, 3, 4]
05.[1, 3, 2, 4, 5, 6]
06.[1, 3, 2, 5, 4, 6]
07.[1, 3, 2, 5, 6, 4]
08.[1, 3, 2, 6, 5, 4]
09.[1, 3, 4, 2, 5, 6]
10.[1, 3, 4, 5, 2, 6]
11.[1, 3, 4, 5, 6, 2]
12.[1, 3, 4, 6, 5, 2]
13.[1, 3, 6, 2, 5, 4]
14.[1, 3, 6, 4, 5, 2]
15.[1, 3, 6, 5, 2, 4]
16.[1, 3, 6, 5, 4, 2]
17.[1, 4, 3, 2, 5, 6]
18.[1, 4, 3, 6, 5, 2]
19.[1, 4, 5, 2, 3, 6]
20.[1, 4, 5, 6, 3, 2]
21.[1, 6, 3, 2, 5, 4]
22.[1, 6, 3, 4, 5, 2]
23.[1, 6, 5, 2, 3, 4]
24.[1, 6, 5, 4, 3, 2]
25.[2, 1, 3, 4, 5, 6]
26.[2, 1, 3, 6, 5, 4]
27.[2, 3, 1, 4, 5, 6]
28.[2, 3, 1, 6, 5, 4]
29.[2, 5, 4, 1, 3, 6]
30.[2, 5, 4, 3, 1, 6]
31.[2, 5, 6, 1, 3, 4]
32.[2, 5, 6, 3, 1, 4]
33.[3, 1, 2, 4, 5, 6]
34.[3, 1, 2, 5, 4, 6]
35.[3, 1, 2, 5, 6, 4]
36.[3, 1, 2, 6, 5, 4]
37.[3, 1, 4, 2, 5, 6]
38.[3, 1, 4, 5, 2, 6]
39.[3, 1, 4, 5, 6, 2]
40.[3, 1, 4, 6, 5, 2]
41.[3, 1, 6, 2, 5, 4]
42.[3, 1, 6, 4, 5, 2]
43.[3, 1, 6, 5, 2, 4]
44.[3, 1, 6, 5, 4, 2]
45.[3, 2, 1, 4, 5, 6]
46.[3, 2, 1, 6, 5, 4]
47.[3, 2, 5, 4, 1, 6]
48.[3, 2, 5, 6, 1, 4]
49.[3, 4, 1, 2, 5, 6]
50.[3, 4, 1, 6, 5, 2]
51.[3, 4, 5, 2, 1, 6]
52.[3, 4, 5, 6, 1, 2]
53.[3, 6, 1, 2, 5, 4]
54.[3, 6, 1, 4, 5, 2]
55.[3, 6, 5, 2, 1, 4]
56.[3, 6, 5, 4, 1, 2]
57.[4, 1, 3, 2, 5, 6]
58.[4, 1, 3, 6, 5, 2]
59.[4, 3, 1, 2, 5, 6]
60.[4, 3, 1, 6, 5, 2]
61.[4, 5, 2, 1, 3, 6]
62.[4, 5, 2, 3, 1, 6]
63.[4, 5, 6, 1, 3, 2]
64.[4, 5, 6, 3, 1, 2]
65.[5, 2, 1, 3, 4, 6]
66.[5, 2, 1, 3, 6, 4]
67.[5, 2, 1, 4, 3, 6]
68.[5, 2, 1, 6, 3, 4]
69.[5, 2, 3, 1, 4, 6]
70.[5, 2, 3, 1, 6, 4]
71.[5, 2, 3, 4, 1, 6]
72.[5, 2, 3, 6, 1, 4]
73.[5, 2, 4, 1, 3, 6]
74.[5, 2, 4, 3, 1, 6]
75.[5, 2, 6, 1, 3, 4]
76.[5, 2, 6, 3, 1, 4]
77.[5, 4, 1, 2, 3, 6]
78.[5, 4, 1, 3, 2, 6]
79.[5, 4, 1, 3, 6, 2]
80.[5, 4, 1, 6, 3, 2]
81.[5, 4, 2, 1, 3, 6]
82.[5, 4, 2, 3, 1, 6]
83.[5, 4, 3, 1, 2, 6]
84.[5, 4, 3, 1, 6, 2]
85.[5, 4, 3, 2, 1, 6]
86.[5, 4, 3, 6, 1, 2]
87.[5, 4, 6, 1, 3, 2]
88.[5, 4, 6, 3, 1, 2]
89.[5, 6, 1, 2, 3, 4]
90.[5, 6, 1, 3, 2, 4]
91.[5, 6, 1, 3, 4, 2]
92.[5, 6, 1, 4, 3, 2]
93.[5, 6, 2, 1, 3, 4]
94.[5, 6, 2, 3, 1, 4]
95.[5, 6, 3, 1, 2, 4]
96.[5, 6, 3, 1, 4, 2]
97.[5, 6, 3, 2, 1, 4]
98.[5, 6, 3, 4, 1, 2]
99.[5, 6, 4, 1, 3, 2]
100.[5, 6, 4, 3, 1, 2]
101.[6, 1, 3, 2, 5, 4]
102.[6, 1, 3, 4, 5, 2]
103.[6, 3, 1, 2, 5, 4]
104.[6, 3, 1, 4, 5, 2]
105.[6, 5, 2, 1, 3, 4]
106.[6, 5, 2, 3, 1, 4]
107.[6, 5, 4, 1, 3, 2]
108.[6, 5, 4, 3, 1, 2]

【参考资料】

1.《新编中学数学解题方法1000招丛书【排列和组合】》P99 刘培杰工作室编 哈尔滨工业大学出版社出版

2.https://www.jb51.net/article/252294.htm

END

 

posted @ 2023-04-21 10:23  逆火狂飙  阅读(80)  评论(0编辑  收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东