第七届蓝桥杯JavaB组——第6题方格填数

解决方案:利用全排列和递归
使用Java中的集合API:HashMap ArrayList

package com.lzp.lanqiaoseven.p6;

import java.util.*;

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

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

(如果显示有问题,也可以参看本篇博文开头)

填入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> list= null;

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

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

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

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

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

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

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

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

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

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

        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个数字依次不重复的填入所有方格,也就是每个方格的数都不能相同(即每个数只能用一次),最后程序竟然跑出结果来了。于是就去网上看下网友的答案,发现我俩的答案是一样的,我觉得没那么巧,答案应该是没有错,我还是不放心,就再搜了几篇博客再验证一下。终于功夫不负有心人,都对上了哈哈,到此本篇博客也就结束了,同时也希望看到这篇博客的朋友们能一起学习交流,如有错误,请多指正!!!

posted @   没有你哪有我  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示