数独Sudoku

数独(すうどく,Sūdoku),是源自18世纪瑞士发明,流传到美国,再由日本发扬光大的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含1-9,不重复。

下面我们写一个小程序来求解数独问题。

对于计算机来说,他无法根据自己的判断聪明的给出解答,只能从首个空位置逐一尝试,如果发现到目前为止走不动了,则需要会退到上一个填数的位置,尝试下一个数字,以此类推。

使用栈的非递归方式。

  • 我们设置一个结构,包含元素的行号、列号以及放置的数字,每次讲放置的信息记录到栈里;
  • 如果走到某个位置发现从1-9没有任何元素可以在这里放置,则需要回溯,回到上一个位置,为下一个位置留出一个元素。

CODE:

import java.util.Stack;class Help {int row;int col;int val;
}
public class Sudoku {/*** Use stack store the roads.* @param chess* @return*/public static int[][] getSudoku(int[][] chess) {Stack<Help> stack = new Stack<Help>();int val = -1;for(int i=0; i<9; i++) {for(int j=0; j<9; j++) {if(chess[i][j] != 0)continue;boolean flag = false;int k;if(val == -1)k = 0;else k = val+1;for(; k<10; k++) {if(isValid(k, i, j, chess)) {Help h = new Help();h.row = i;h.col = j;h.val = k;stack.add(h);chess[i][j] = k;val = -1;flag = true;}if(flag == true)k = 10;}if(flag == false && !stack.isEmpty()) { //There is no road, backtrackingHelp h = stack.pop();i = h.row;j = h.col-1;val = h.val;chess[i][j+1] = 0;}}}return chess;}/*** Judge if it is valid when chess[row][col] = k.* @param k* @param row* @param col* @param chess* @return*/private static boolean isValid(int k, int row, int col, int[][] chess) {for(int i=0; i<9; i++)if(chess[row][i] == k)return false;for(int i=0; i<9; i++) if(chess[i][col] == k)return false;int r = row/3, c = col/3;for(int i=r*3; i<r*3+3; i++) {for(int j=c*3; j<c*3+3; j++) {if(chess[i][j] == k)return false;}}return true;}public static void main(String[] args) {// TODO Auto-generated method stubint[][] a = {{0,4,2,0,6,3,0,0,9},{6,0,0,0,1,0,0,0,5},{3,0,0,0,2,0,4,8,0},{1,0,0,5,0,2,6,0,8},{4,0,0,0,0,7,0,0,1},{9,0,5,6,0,0,0,0,7},{0,3,6,0,5,0,0,0,2},{2,0,0,0,7,0,0,0,4},{7,0,0,2,9,0,8,5,0}};int[][] res = getSudoku(a);for(int i=0; i<9; i++) {for(int j=0; j<9; j++)System.out.print(res[i][j] + " ");System.out.println();}}}

转载于:https://www.cnblogs.com/little-YTMM/p/5507841.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑CPU选购的几个指标

CPU的概念介绍 CPU是Central Processing Unit(中央处理器)的缩写&#xff0c;CPU的详细参数包括内核结构&#xff0c; 主频&#xff0c;外频&#xff0c;倍频&#xff0c;接口&#xff0c;缓存&#xff0c;多媒体指令集&#xff0c;制造工艺&#xff0c;电压&#xff0c;封装形…

idea生成方法注释的正确方法

生成方法注释 1.打开File -> Settings 2.Editor -> Live Templates -> 点击右边加号为自己添加一个Templates Group -> 然后选中自己的Group再次点击加号添加Live Templates 重点&#xff1a;Abbreviation那里不要用/开头的&#xff01;&#xff01;&#xff01; …

php linux 缓存文件,Linux下搭建网站提示缓存文件写入失败怎么办?

Linux下搭建网站提示缓存文件写入失败时该怎么处理&#xff1f;基于ThinkPHP框架及Linux环境搭建的网站&#xff0c;经常会遭遇缓存文件写入失败的错误提示&#xff0c;即便是现在流行的P2P网站程序便是如此&#xff0c;具体解决方法请看下文。Linux下搭建网站提示缓存文件写入…

什么是CharSequence

CharSequence是一个接口&#xff0c;比较常见的String、StringBuilder、StringBuffer都实现了这个接口。 当我们看到一个API里面有CharSequence的时候&#xff0c;它也是可以被其子类代替的&#xff0c;一般用String代替即可。

你真的了解显卡吗?显卡基础知识大扫盲

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Servlet的运行方式

通常我们运行servlet需要在web.xml配置文件中&#xff0c;注册我们写好的servlet以及其对应的访问路径。 在学习web开发中&#xff0c;有一种不需要配置便可以直接对servlet进行配置的方式&#xff0c;在web.xml文件中添加如下代码&#xff1a; <servlet><servlet-nam…

matlab中select,[转载]MATLAB阈值获取函数ddencmp、thselect、wbmpen和w

crit(t)wdcbm的调用格式有以下两种&#xff1a;(1)[THR,NKEEP]wdcbm(C,L,ALPHA);(2)[THR,NKEEP]wdcbm(C,L,ALPHA,M);函数wdcbm是使用Birge-Massart算法获取一维小波变换的阈值。返回值THR是与尺度无关的阈值&#xff0c;NKEEP是系数的个数。[C,L]是要进行压缩或消噪的信号在jle…

使用Redis让单号从001递增

最近项目遇到一个需求&#xff0c;单号从001开始递增 下面用到了redis处理 代码如下&#xff1a; public String getId() {String key "providerManager";Long incr getIncr(key);if (incr 0) {incr getIncr(key);//从001开始}DecimalFormat df new DecimalF…

硬件知识:直接拔掉USB移动硬盘会对硬盘造成影响吗?

大家在网上经常可以看到直接拔掉移动硬盘会损坏硬盘的文章。如果说突然拔掉硬盘会造成丢失数据我还有一点相信&#xff0c;但是说会造成损坏硬盘感觉就会有些疑问了。难道USB设备在开始设计时&#xff0c;没有考虑到热插拔这个动作&#xff1f; 移动硬盘在通电工作时&#xff0…

php多个构造方法,php多构造器的实例代码

本节内容&#xff1a;php多构造器的类在php编程中&#xff0c;实例化一个类时&#xff0c;需要根据构造方法的参数个数进行初始化不用的内容&#xff0c;类似php函数或方法的可选参数。来看例子&#xff1a;复制代码 代码示例:/*** php 多构造器的类* by www.jbxue.com*/class …

硬件:显示器接口DP、HDMI、VGA、DVI有什么区别?

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

判断2个list中是否有相同的数据(相交)Collections.disjoint

比较两个集合中是否有相同的元素&#xff0c;发现Collections类下的disjoint方法可以处理 Collections.disjoint() 代码如下: List<Integer> list3 new ArrayList<>(); list3.add(1); list3.add(1); list3.add(6); List<Integer> list4 new ArrayList<…

java 复杂验证码生成,java验证码生成种

java验证码生成类package cn.edu.pdsu.action;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.se…

电脑硬件:蓝屏的常见解决方案

我们在使用电脑的时候经常会遇到电脑蓝屏的故障&#xff0c;这个可以算是电脑故障最频繁出现的一个了&#xff0c;今天给大家介绍一下电脑蓝屏常见的处理办法&#xff0c;希望能给大家带来一些 帮助&#xff01; 1、电脑蓝屏一般处理办法 1、先了解发生蓝屏前电脑的情况及所做的…

1、Canvas的基本用法

1、Canvas是什么&#xff1f; HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。 画布是一个矩形区域&#xff0c;您可以控制其每一像素。 canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 2、创建 Canvas 元素 规定元素的 id、宽度和高度&#xff1a; …

用lambda表达式实现Runnable

用lambda表达式实现Runnable lambda表达式替换了原来匿名内部类的写法&#xff0c;没有了匿名内部类繁杂的代码实现&#xff0c;而是突出了&#xff0c;真正的处理代码。最好的示例就是 实现Runnable 的线程实现方式了: 用() -> {}代码块替代了整个匿名内部类 Test public …

java弱引用怎么手动释放,十分钟理解Java中的弱引用,十分钟java引用

十分钟理解Java中的弱引用&#xff0c;十分钟java引用本篇文章尝试从What、Why、How这三个角度来探索Java中的弱引用&#xff0c;帮助大家理解Java中弱引用的定义、基本使用场景和使用方法。由于个人水平有限&#xff0c;叙述中难免存在不准确或是不清晰的地方&#xff0c;希望…

软件:推荐六款实用的录频软件

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

安装 openSUSE Leap 42.1 之后要做的 8 件事

导读openSUSE Leap 确实是个巨大的飞跃&#xff0c;它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版。和其它系统一样&#xff0c;为了实现最佳的使用效果&#xff0c;在使用它之前需要做些优化设置。下面是一些我在我的电脑上安装 openSUSE Leap 之后做的一些事情…

Java8 Stream Collectors groupingBy使用

分组List并显示其总数。 Test public void test8() {//3 apple, 2 banana, others 1List<String> items Arrays.asList("apple", "apple", "banana","apple", "orange", "banana", "papaya");Map…