java课程 数独 文库_一次数独生成及求解方案的剖析(Java实现)

数独生成及求解方案剖析(Java实现)

关键词

数独9x9

数独生成

数独解题

序言

最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接)。写到核心部分发现平时玩的数独这个东西,还真有点意思:

行、列、子宫格之间的数字互相影响,牵一发而动全身,一不留神就碰撞冲突了,简直都能搞出玄学的意味,怪不得古人能由此“九宫格”演绎出八卦和《周易》。

于是自己想了不少算法,也查找了不少资料,但是都没有找到理想的Java实现;最后无意间在Github发现一个国外大佬写了这样一个算法,体味一番,顿觉精辟!

本篇就是把国外大佬的这个算法拿过来,进行一个深入的解析,希望能帮助到用得上的人。

正文

先上地址

代码只有三个类:

Generator.java

生成器 -> 生成数独格子

Solver.java

解法器 -> 数独求解

Grid.java

网格对象 -> 基础数独格子对象

直接上main方法看下基本调用:

public static void main(String[] args) {

// 生成一个20个空格的9x9数独

Generator generator = new Generator();

Grid grid = generator.generate(20);

System.out.println(grid.toString());

// 9x9数独求解

Solver solver = new Solver();

solver.solve(grid);

System.out.println(grid.toString());

}

看下输出结果(输出方法我自己进行了修改):

生成的9x9数独(0为空格)

[9, 8, 0, 1, 0, 2, 5, 3, 7]

[1, 4, 2, 5, 0, 7, 9, 8, 6]

[0, 3, 7, 0, 8, 0, 1, 0, 0]

[8, 9, 1, 0, 2, 4, 3, 0, 5]

[6, 2, 0, 0, 0, 5, 8, 0, 0]

[3, 7, 0, 8, 9, 1, 6, 2, 4]

[4, 6, 9, 2, 1, 8, 7, 5, 3]

[2, 1, 8, 0, 0, 0, 4, 6, 9]

[0, 5, 3, 4, 6, 9, 2, 1, 8]

数独求解

[9, 8, 6, 1, 4, 2, 5, 3, 7]

[1, 4, 2, 5, 3, 7, 9, 8, 6]

[5, 3, 7, 9, 8, 6, 1, 4, 2]

[8, 9, 1, 6, 2, 4, 3, 7, 5]

[6, 2, 4, 3, 7, 5, 8, 9, 1]

[3, 7, 0, 8, 9, 1, 6, 2, 4]

[4, 6, 9, 2, 1, 8, 7, 5, 3]

[2, 1, 8, 7, 5, 3, 4, 6, 9]

[7, 5, 3, 4, 6, 9, 2, 1, 8]

使用起来很简单,速度也很快;其核心部分的代码,其实只有三个点。

1. 第一点 解法

随机数组

递归填数

在Solver.java中solve方法实现;

每次遍历的是使用交换方法实现的随机数组,保证了随机数组空间的有限占用,并且能够减少枚举过程中的重复几率。

代码我已经做了中文注释:

/**

* 获取随机数组

*

* @return

*/

private int[] generateRandomValues() {

// 初始化随机数组 此处空格子0是因为格子初始化的时候 默认给的就是0 便于判断和处理

int[] values = {EMPTY, 1, 2, 3, 4, 5, 6, 7, 8, 9};

Random random = new Random();

// 使用交换法构建随机数组

for (int i = 0,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值