解决方案:利用全排列和递归

package com.lzp.lanqiaoseven.p6;

import java.util.*;

/**
 * @Author LZP
 * @Date 2021/2/26 14:38
 * @Version 1.0
 *
 *
方格填数

如下的10个格子
     +--+--+--+
     |  |  |  |
  +--+--+--+--+
  |  |  |  |  |
  +--+--+--+--+
  |  |  |  |
  +--+--+--+

(如果显示有问题,也可以参看【图1.jpg】)

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
 
 全排列
 */
public class Main {

    private static int[] arr = new int[11];

    /**
     * 辅助数组
     */
    private static int[] dp = new int[10];

    private static int count;

    private static Map<Integer, List<Integer>> map = null;

    private static List<Integer> set = null;

    public static void main(String[] args) {
        map = new HashMap<>();
        set = new ArrayList<>();
        set.add(2);
        set.add(4);
        set.add(5);
        set.add(6);
        map.put(1, set);

        set = new ArrayList<>();
        set.add(1);
        set.add(3);
        set.add(5);
        set.add(6);
        set.add(7);
        map.put(2, set);

        set = new ArrayList<>();
        set.add(2);
        set.add(6);
        set.add(7);
        map.put(3, set);

        set = new ArrayList<>();
        set.add(1);
        set.add(5);
        set.add(8);
        set.add(9);
        map.put(4, set);

        set = new ArrayList<>();
        set.add(1);
        set.add(2);
        set.add(4);
        set.add(6);
        set.add(8);
        set.add(9);
        set.add(10);
        map.put(5, set);

        set = new ArrayList<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(5);
        set.add(7);
        set.add(9);
        set.add(10);
        map.put(6, set);

        set = new ArrayList<>();
        set.add(2);
        set.add(3);
        set.add(6);
        set.add(10);
        map.put(7, set);

        set = new ArrayList<>();
        set.add(4);
        set.add(5);
        set.add(9);
        map.put(8, set);

        set = new ArrayList<>();
        set.add(4);
        set.add(5);
        set.add(6);
        set.add(8);
        set.add(10);
        map.put(9, set);

        set = new ArrayList<>();
        set.add(5);
        set.add(6);
        set.add(7);
        set.add(9);
        map.put(10, set);

        division(1);
        System.out.println(count);
    }

    public static void division(int pos) {
        if (pos > 10) {
            boolean flag = true;
            for (int i = 1; i < arr.length; i++) {
                List<Integer> values = map.get(i);
                for (int j = 0; j < values.size(); j++) {
                    int temp = arr[values.get(j)];
                    if (arr[i] - 1 == temp || arr[i] + 1 == temp) {
                        // 两数连续
                        flag = false;
                        break;
                    }
                }
                if (!flag) {
                    break;
                }
            }
            if (flag) {
                count++;
            }
            return;
        }

        for (int i = 0; i <= 9; i++) {
            if (dp[i] == 0) {
                dp[i] = 1;
                arr[pos] = i;
                division(pos + 1);
                dp[i] = 0;
            }
        }
    }
}

运行结果:

感悟:一开始总以为各个方格可以填写重复了数,然后用代码实现的时候发现结果好长时间都没运行出来,这时就反过来思考,这毕竟是一个结果填空题,题目应该不至于那么复杂,然后就再试了一下将0~9这10个数字依次不重复的填入所有方格,也就是每个方格的数都不能相同(即每个数只能用一次),最后程序竟然跑出结果来了。于是就去网上看下网友的答案,发现我俩的答案是一样的,我觉得没那么巧,答案应该是没有错,我还是不放心,就再搜了几篇博客再验证一下。终于功夫不负有心人,都对上了哈哈,到此本篇博客也就结束了,同时也希望看到这篇博客的朋友们能一起学习交流,并多多指正小弟!!!

版权声明:本文为pengsay原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/pengsay/p/14452774.html