java实现第六届蓝桥杯五星填数

五星填数

如【图1.png】的五星图案节点填上数字:1~12,除去7和11。
要求每条直线上数字和相等。

如图就是恰当的填法。

请你利用计算机搜索所有可能的填法有多少种。
注意:旋转或镜像后相同的算同一种填法。

请提交表示方案数目的整数,不要填写任何其它内容。

答案:12

在这里插入图片描述

public class Main {
    public static int count = 0;
    
    public void swap(int[] A, int i, int j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
    
    public void check(int[] A) {
        int sum1 = A[0] + A[2] + A[5] + A[8];
        int sum2 = A[0] + A[3] + A[6] + A[9];
        int sum3 = A[1] + A[2] + A[3] + A[4];
        int sum4 = A[1] + A[5] + A[7] + A[9];
        int sum5 = A[4] + A[6] + A[7] + A[8];
        if(sum1 == sum2 && sum1 == sum3 && sum1 == sum4 && sum1 == sum5) {
            count++;
        } else
            return;
    }
    
    public void dfs(int[] A, int step) {
        if(step == A.length) {
            check(A);
            return;
        } else {
            for(int i = step;i < A.length;i++) {
                swap(A, i, step);
                dfs(A, step + 1);
                swap(A, i, step);
            }
        }
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        int[] A = {1,2,3,4,5,6,8,9,10,12};
        test.dfs(A, 0);
        System.out.println(count / 10);
    }
}
posted @ 2019-07-29 19:34  南墙1  阅读(33)  评论(0编辑  收藏  举报