java数独代码_求解数独的所有解法,java编程实现
数独是一种考验眼力和逻辑的小游戏,关键在这个“独”字上,横竖不能重复,方块不能重复。今天我给大家介绍一种利用“循环+递归+回溯”的办法来用Java程序替我们完成数独。
先给代码随后讲解:
1 importjava.util.HashMap;
2 importjava.util.Map;
3
4 public classT2 {
5 public static final int N=3;
6 public static voidmain(String[] args) {
7 int x[][]={
8 {0,2,0,0,0,9,0,1,0,0},
9 {5,0,6,0,0,0,3,0,9,0},
10 {0,8,0,5,0,2,0,6,0,0},
11 {0,0,5,0,7,0,1,0,0,0},
12 {0,0,0,2,0,8,0,0,0,0},
13 {0,0,4,0,1,0,8,0,0,0},
14 {0,5,0,8,0,7,0,3,0,0},
15 {7,0,2,3,0,0,4,0,5,0},
16 {0,4,0,0,0,0,0,7,0,0},
17 };
18
19 function(x,0,0);
20
21 }
22
23 private static void function(int[][] x, int r, intc) {
24 if (r>=x.length) {
25 show(x);
26 return;
27 }
28 if (c==0&&(r==x.length/N||r==x.length/N*2||r==x.length)) {
29 if (!checkedbox(x,r)) {
30 return;
31 };
32
33 }
34 if (c>=x.length) {
35 function(x, r+1, 0);
36 return;
37 }
38
39 if (x[r][c]==0) {
40 for (int i = 1; i <= x.length; i++) {
41 if(checked(x,r,c,i)) {
42 x[r][c]=i;
43 function(x, r, c+1);
44 x[r][c]=0;
45 }
46 }
47 }else{
48 function(x, r, c+1);
49 }
50 }
51 private static boolean checkedbox(int[][] x, intr) {
52 for (int k = 0; k < x.length; k+=x.length/N) {
53 Map map=new HashMap<>();
54 for (int i = r-N; i < r; i++) {
55 for (int j = k; j < k+x.length/N; j++) {
56 if(map.containsKey(x[i][j])) {
57 return false;
58 }
59 map.put(x[i][j], 1);
60 }
61 }
62
63 }
64 return true;
65 }
66
67 private static boolean checked(int[][] x, int r, int c, inti) {
68 for (int j = 0; j < x.length; j++) {
69 if (x[j][c]==i) {
70 return false;
71 }
72 if (x[r][j]==i) {
73 return false;
74 }
75 }
76 return true;
77 }
78
79 private static void show(int[][] x) {
80 for (int i = 0; i < x.length; i++) {
81 for (int j = 0; j < x.length; j++) {
82 System.out.print(x[i][j]+" ");
83 }
84 System.out.println();
85 }
86 System.out.println();
87 }
88
89 }
类里有五个函数,一是主函数不多说;二是递归的主体函数function,是解决数独的关键,体现循环+递归+回溯的主要逻辑;三和四都是是一个辨识函数,一些较为复杂的判断逻辑把它抽出来写成辨识函数可以增加代码的可读性;五是一个打印函数很简单。
function函数的实际意义是填写x[r][c]的数字,更确切的说是填写x数组的(r,c)坐标以后的所有数字,内部基本的结构是4个并列的if,第一个if是说如果我填的行号超过了最大值就打印整个数组;第二个if是说当我在填写第3、6、9行开头数字的时候要检查一下上边的三行的方块里是不是有重复的数字;第三个if是说我填写到最后一个元素的时候,要转到下一行开头去;第四个if是说当前的坐标是0的时候才开始循环填写,否则跳过去填写下一个数字。
checkedbox函数利用了一个很巧妙的查重思想----循环嵌套map集合的先查后装思想。当然这个思想你肯定没听说过,因为这个名字是我起的。注意我在第59行给map装值的时候是把数组的值装在map的键里,这样是为了第56行使用map集合的containsKey函数。当然我这样给方块查重是有点秀操作了,其实用一个长度为9的数组也可以。
checked函数和show函数都非常简单,就不多提了。
我给出的数独例子是一个只有一个结果的数独,是比较难的,有兴趣的话可以去搜一搜别的数独来测试一下这个代码吧!!
这个方法可以把一个数独的所有解法全部列举出来
拓展:
这个循环+递归+回溯的模式可以解决所有按照规则填写数字的问题,比如说:九宫格填写1-9横竖斜相加相等啦、十六宫格填写1-16啦等等。
java数独代码_求解数独的所有解法,java编程实现相关推荐
- java品尝饮料代码_求解各位高手:用java解决品尝饮料问题
展开全部 e68a84e8a2ad62616964757a686964616f31333264653432import java.util.ArrayList; import java.util.Li ...
- java课程 数独 文库_一次数独生成及求解方案的剖析(Java实现)
数独生成及求解方案剖析(Java实现) 关键词 数独9x9 数独生成 数独解题 序言 最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接).写到核心部分发现平时玩的数独这个 ...
- 数独解题思路——求解数独
求解数独过程用到了DLX(Dancing Links)算法,算法的基础是回溯算法,主要用于解决精准覆盖问题. 回溯法及假设当前位置的数字,然后往下一个位置进行,直到进行到某一个位置时发现无论如何也找不 ...
- 冒泡排序java代码_数据结构与算法—冒泡排序(Java实现)
[toc] 冒泡排序 程序代码 package com.uplooking.bigdata.datastructure; import java.util.Arrays; public class B ...
- 图书管理系统jsp代码_【程序源代码】使用Java开发的图书管理系统
关键字:java 管理系统 正文 | 内容 01 - [概述] 使用Java开发的图书管理系统,读者可以注册登录,登录时会判断账号类型再分别跳到各自对应的页面,读者可以查找,借阅,还书,查看历史借阅 ...
- java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势
java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...
- java 编写代码_如果您在2015年编写过Java代码-这是您不容错过的趋势
java 编写代码 去年我们有机会遇到的最有趣趋势的实用概述 在这篇文章中,我们回顾了构成我们2015年对话的5个主题和新发展.与其他许多年终总结保持较高水平的不同,我们将做一个更实际的操作不用流行语 ...
- amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境
今天给大家分享一下如何配置java的JDK环境.操作步骤如下: 1.下载好 jdk 的安装文件,我下载的是 jdk-10.0.1_windows-x64_bin.exe 这个版本的安装文件: 2.使用 ...
- java 字符串匹配_多模字符串匹配算法原理及Java实现代码
多模字符串匹配算法在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于 ...
- aixs1 生成java代码_通过axis1.4 来生成java客户端代码
1.首先下载axis-1.4所有的jar包, 2.我是直接打开cmd,进入到该jar包的目录下, 3.直接运行命令(运行这个命令之前要确定java的环境变量都已配置好): java -Djava.ex ...
最新文章
- 大年初二,今年过年你选择在男方家过还是女方家过?
- [Java基础]让Map value自增
- Apache Thrift的使用
- (全部)2008重磅出击——微软Windows Server 2008实战攻略系列
- C++主要操作符重载的定义和总结
- ASP.NET MVC呼叫WCF Service的方法
- mybatis笔记之使用Mapper接口注解
- ARM64 Linux 内核页表的块映射
- 安装qt qmake 错误:could not find a Qt installation of ''
- book_note for《Linux程序设计》chapter3 Linux系统C语言开发工具
- Manjaro使用教程
- Quartus prime工程中各种文件的后缀及意义
- 无效的m3u8怎么办_vue使用video.js解决m3u8视频播放格式
- 51单片机通过DHT11温度传感器读取温度(2)
- 从联立方程式看机器学习的数学模式
- 计算机组成原理--储存器概述
- Dialog使用时has leaked window...that was originally added here错误
- 启用触发器 和 关闭触发器
- 【知识分享】如何制作Gif动态图
- 王姨劝我学HarmonyOS鸿蒙2.0系列教程之四Git搭建下载实例!