五星填数-蓝桥杯决赛

来源:互联网 发布:淘宝的安逸猿 编辑:程序博客网 时间:2024/05/21 09:19

题目描述

标题:五星填数

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

如图就是恰当的填法。

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

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

简单分析

典型暴力,不过由于太多的数,所以用for不是太好的选择
可以用深度优先dfs

最后/10是由于镜像与旋转的原因,对比那个反幻方,可以看出除的那个数和边的个数有关 /(边的个数*2)

代码奉上

public class e2 {    static int[] data = { 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 };    static int[] res = new int[data.length];    static boolean[] vis = new boolean[data.length];    static int count = 0;    public static void dfs(int n) {        if (n == data.length) {            if (isOk()) {                count++;            }        } else {            for (int i = 0; i < data.length; i++) {                if (vis[i])                    continue;                vis[i] = true;                res[n] = data[i];                dfs(n + 1);                vis[i] = false;            }        }    }    // 判断是否符合情况    private static boolean isOk() {        int add[] = new int[5];        add[0] = res[0] + res[2] + res[5] + res[7];        add[1] = res[0] + res[3] + res[6] + res[9];        add[2] = res[1] + res[2] + res[3] + res[4];        add[3] = res[1] + res[5] + res[8] + res[9];        add[4] = res[4] + res[6] + res[8] + res[7];        for (int i = 0; i < add.length - 1; i++) {            for (int j = i + 1; j < add.length; j++) {                if (add[j] != add[i])                    return false;            }        }        return true;    }    public static void main(String[] args) {        dfs(0);        System.out.println(count / 10);    }}

运行结果 :12

原创粉丝点击