Java数独求解

java求解数独(递归) 华为面试题 阅读详情

#第一次分享项目#
GitHub项目:shudu
功能:
(1)自行设计数独问题的输入和输出数据格式,例如,可以用txt形式存储数独题目。
(2)能够自动求解数独问题。
(3)输出求解结果,保存在文件中。

完整代码:

8package shudu;
910import java.io.File;
11import java.io.FileInputStream;
1213import java.io.FileOutputStream;
14import java.io.IOException;
15import java.io.InputStream;
16import java.io.OutputStream;
1718import java.util.Arrays;
19import java.util.HashMap;
20import java.util.Map;
2122public class demo {
23public static int[][] x= new int[9][9];
2425public static void readFile() {	//读取文件
26、			File fp=new File("D:\\eclipse\\demo\\shudu\\src\\includ.txt");
27、			InputStream i=null;
28try {
29、				i=new FileInputStream(fp);
30//fp可能为空
31int temp;
32int j=0,k=0;//定义一个赋值时候使用的下标
33while((temp=i.read())!=-1) {
34if((char) temp>='0'&&(char) temp<='9') {
35int num = Integer.valueOf(""+(char) temp);
36、						x[j][k]=num;
37、						k++;
38if(k==9) {
39、							k=0;
40、							j++;
41}
42}
43}
44}catch(Exception e) {	
45、				e.printStackTrace();
46}
47finally {
48try {
49、					i.close();
50//可能i并没有指向,简单说就是有没开启的可能
51} catch (IOException e) {
52、					e.printStackTrace();
53}
54}
55}
5657public static final int N=3;
58public static void main(String[] args) {
5960readFile();
61、	    	System.out.println("文件读取结果:");	
62for (int i = 0; i < x.length; i++) {		//输出文件信息
63for (int j = 0; j < x.length; j++) {
64、	                System.out.print(x[i][j]+" ");
65}
66、	            System.out.println();
67}
68、	    	System.out.println("数独解题结果:");
69function(x,0,0);
7071}
7273private static void function(int[][] x, int r, int c) {		//填写x数组的(r,c)坐标以后的所有数字
74if (r>=x.length) {		//填的行号超过了最大值就打印整个数组
75show(x);
76return;
77}
78if (c==0&&(r==x.length/N||r==x.length/N*2||r==x.length)) {		//填写第3、6、9行开头数字的时候要检查一下上边的三行的方块里是不是有重复的数字
79if (!checkedbox(x,r)) {
80return;
81};
8283}
84if (c>=x.length) {		//填写到最后一个元素的时候,要转到下一行开头去
85function(x, r+1, 0);
86return;
87}
8889if (x[r][c]==0) {		//当前的坐标是0的时候才开始循环填写,否则跳过去填写下一个数字
90for (int i = 1; i <= x.length; i++) {
91if (checked(x,r,c,i)) {
92、	                    x[r][c]=i;
93function(x, r, c+1);
94、	                    x[r][c]=0;
95}
96}
97}else{
98function(x, r, c+1);
99}
100}
101private static boolean checkedbox(int[][] x, int r) {
102for (int k = 0; k < x.length; k+=x.length/N) {
103、	            Map<Integer, Integer> map=new HashMap<>();
104for (int i = r-N; i < r; i++) {
105for (int j = k; j < k+x.length/N; j++) {
106if (map.containsKey(x[i][j])) {
107return false;
108}
109、	                    map.put(x[i][j], 1);
110}
111}
112}
113return true;
114}
115116private static boolean checked(int[][] x, int r, int c, int i) {
117for (int j = 0; j < x.length; j++) {
118if (x[j][c]==i) {
119return false;
120}
121if (x[r][j]==i) {
122return false;
123}
124}
125return true;
126}
127128private static void show(int[][] x) {		//将结果输出至控制栏
129for (int i = 0; i < x.length; i++) {
130for (int j = 0; j < x.length; j++) {
131、	                System.out.print(x[i][j]+" ");
132}
133、	            System.out.println();
134}
135、	        System.out.println();               
136、	      File file = new File("./shudu.txt");		//建立输出文件
137、	        OutputStream out = null;
138try {
139、	        	out = new FileOutputStream(file);
140、	        	String str = new String();			//将结果变量强制转换成为可以输出到文件的形式
141for(int i=0;i<x.length;i++) {
142、	        		str = str+Arrays.toString(x[i])+"\n";
143}
144byte[] b = str.getBytes();
145、	        	out.write(b, 0, b.length);
146、	        	out.flush();
147}catch(Exception e) {
148、	        	e.printStackTrace();
149}finally {
150try {
151、					out.close();
152、					System.out.println("结果已保存至文件。");
153}catch (Exception e) {
154// TODO: handle exception
155}
156}
157}
158}

运行结果:
在这里插入图片描述
先将数独问题导入,查找到后导入进程序内,进入解题程序
数独解题类里有五个函数,一是主函数;二是递归的主体函数function,是解决数独的关键,体现循环+递归+回溯的主要逻辑;三和四都是一个辨识函数,一些较为复杂的判断逻辑写成辨识函数可以增加代码的可读性;五是一个打印函数。
function函数的实际意义是填写x[r][c]的数字,更确切的说是填写x数组的(r,c)坐标以后的所有数字,内部基本的结构是4个并列的if,第一个if是填写的行号超过了最大值就打印整个数组;第二个if是填写第3、6、9行开头数字的时候要检查一下上边的三行的方块里是不是有重复的数字;第三个if是填写到最后一个元素的时候,要转到下一行开头去;第四个if是当前的坐标是0的时候才开始循环填写,否则跳过去填写下一个数字。
最后使用checked函数和show函数
按照原理这个方法可以把一个数独的所有解法全部列举出来

Java数独求解器的设计与实现 数独是一种经典的逻辑填数游戏,广泛流行于全球。游戏的目标是在9x9的网格中填入数字,使得每一行、每一列以及九个3x3的子网格(也称为“区块”)内的数字都不重复,范围从1到9。数独游戏不仅挑战玩家的逻辑思维能力,也吸引了众多算法研究者对解决此问题的探索。本章将介绍数独问题的基本规则,以及解决数独问题的原理,包括穷举法、回溯法、候选值法、区块删减法等。通过介绍这些原理,为读者提供一个对数独问题解决方法的全面理解。 阅读详情

相关推荐

Java实现递归数独求解器的实践

数独是一种经典的逻辑填数字游戏。它的目标是在9×9的网格内,根据已有的数字提示,填充空格使得每一行、每一列以及九个3×3的小格子(也称为“宫”)内数字1至9各出现一次。这个游戏不仅考验玩家的记忆力,而且锻炼了推理与逻辑能力。数独游戏的规则简单易懂,但想要达到高手境界,需要灵活运用各种策略。递归算法,作为一种模拟人类思考问题方式的编程技巧,在数独求解中得到了广泛的应用。通过递归算法实现的数独求解器可以帮助玩家快速找到解决方案,从而让玩家能够专注于数独的策略和逻辑推理过程。

weixin_35728286的博客 867

LeetCode 7. Reverse Integer 一个整数倒叙输出

潜在问题:(1)随着求和可能精度会溢出int 范围,需要使用long 来辅助判断是否溢出,此时返回 0 Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231− 1]. ...

weixin_33910385的博客 574

数独解题算法java代码,采用回溯+递归的做法,仅供学习

数独算法,把数独题按照二位数组的方式填入到代码中的original,并复制一个到sudoku,然后直接执行即可算出结果。 提供了java的源代码,可以为长期受数独大坑困扰的人民服务,祝大家早日脱坑,也为学生朋友提供回溯+递归算法的学习。

数独Java

我们使用三个boolean数组,多开一个位置让下标与数字映射。37. 解数独t编写一个程序,通过填充空格来解决数独问题。数独部分空格内已填入了数字,空白格用。

m0_57248981的博客 855

数独问题(java

数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。 public class Sudoku { private static int[][] board = new int[9][9]; public static void main(String[] args) throws IOException{ rea

m0_49201977的博客 622

Java编程实战12:解数独

编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:输入:board = [[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”],[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”],[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”],[“7”,“.”,“.”,“.”,“2

Code Writers 1193

JAVA学习-练习试用Java实现“解数独

在 'isvaild' 函数中,我们需要检查当前数字在所在的 3x3 宫内是否重复。我们通过计算当前单元格所在的 3x3 宫的左上角坐标 'start_row' 和 'start_col',然后遍历这个 3x3 宫内的所有单元格进行检查。(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。

weixin_69763181的博客 1176

java 数独算法_[Java] 数独生成和求解

思路1.生成数独数独的生成总体思路是挖洞法。首先在二维数组第一行随机填充1-9 9个数字,然后将这9个数字随机分布到整个二维数组中,然后使用求解数独算法对此时的数组进行求解,得到一个完整的数独,然后按照用户输入的提示数量进行随机挖洞,得到最终的数独题目。这种方法理论上可以随机生成(81!/72! = 9.5e+16)种不同的数独题目,足够人类玩上几百年了。2.求解数独求解数独使用的是计算机最擅长...

weixin_35182280的博客 2509

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

数独生成及求解方案剖析(Java实现)关键词数独9x9数独生成数独解题序言最近业务在巩固Java基础,编写了一个基于JavaFX的数独小游戏(随后放链接)。写到核心部分发现平时玩的数独这个东西,还真有点意思:行、列、子宫格之间的数字互相影响,牵一发而动全身,一不留神就碰撞冲突了,简直都能搞出玄学的意味,怪不得古人能由此“九宫格”演绎出八卦和《周易》。于是自己想了不少算法,也查找了不少资料,但是都没...

weixin_29066781的博客 271

数独求解java

1、牛客网原题: 数独是一个我们都非常熟悉的经典游戏,运用计算机我们可以很快地解开数独难题,现在有一些简单的数独题目,请编写一个程序求解。 输入描述: 输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的。 输出描述: 输出九行,每行九个空格隔开的数字,为解出的答案。 2、code实现 package schooloffer

iCoding91 602

java数独算法_数独求解算法(回溯法和唯一解法)java实现

数独(すうどく,Sudoku)是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。注:数独的各种知识和解决思路请 参考http://www.llang.net/sudoku/一、DFS深度填数检测+回溯法参考:blog.csdn.net/hll174/article/details/5109...

weixin_35918198的博客 1376

求解数独的所有解法,java编程实现

数独是一种考验眼力和逻辑的小游戏,关键在这个“独”字上,横竖不能重复,方块不能重复。今天我给大家介绍一种利用“循环+递归+回溯”的办法来用Java程序替我们完成数独。 先给代码随后讲解: 1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class T2 { 5 public stati...

weixin_30532987的博客 296

Java 数独游戏求解,dfs

dfs深度优先解决数独游戏问题 今天做到了一道题目是关于解决数独游戏的问题,这也是我第一次用dfs深度优先来解决问题很开心,能解决这种看起来非常难的问题。 数独游戏 玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。 输入包含9x9的已知数字,空位用0补齐,中间用空格隔开。(输入数独题目确保正确) 输出为输入数独题目的...

qq_43625843的博客 445

DFS求解数独java版本)

问题描述 你一定听说过“数独”游戏。 如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。 数独的答案都是唯一的,所以,多个解也称为无解。 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。 本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有...

sparky的博客 353

数独问题的Java语言求解

数独问题有一个很重要的概念是“相关20格”,就是指一个单元格它的同行、同列以及同一个小九宫格的共计20个小单元格 。每个单元格的变化只会直接影响它的相关20格。 首先为每个单元格建立一个候选列表,并且初始化的时候用已经给出的提示数对每个单元格的候选列表进行排除。然后循环对每个单元格进行试数,每进行一次试数,就需要更新这个单元格的相关20格的候选列表,如果这个单元格的相关20格中某个单元格的候选列

1199

[Java] 数独生成和求解

思路 1.生成数独 数独的生成总体思路是挖洞法。首先在二维数组第一行随机填充1-9 9个数字,然后将这9个数字随机分布到整个二维数组中,然后使用求解数独算法对此时的数组进行求解,得到一个完整的数独,然后按照用户输入的提示数量进行随机挖洞,得到最终的数独题目。这种方法理论上可以随机生成(81!/72! = 9.5e+16)种不同的数独题目...

weixin_34326179的博客 474

java数独代码_求解数独的所有解法,java编程实现

数独是一种考验眼力和逻辑的小游戏,关键在这个“独”字上,横竖不能重复,方块不能重复。今天我给大家介绍一种利用“循环+递归+回溯”的办法来用Java程序替我们完成数独。先给代码随后讲解:1 importjava.util.HashMap;2 importjava.util.Map;34 public classT2 {5 public static final int N=3;6 p...

weixin_34031238的博客 1098

Leetcode算法数独求解Java

题目如下:(链接:题目地址) 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。 //输入格式: [["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [

weixin_45943597的博客 525
下一篇: 二叉树的一维数组保存_案例
Jia_plus
博客等级 码龄6年 83粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值