数独(すうどく,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, backtracking
Help 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 stub
int[][] 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();
}
} }

数独Sudoku的更多相关文章

  1. [Swift]LeetCode37. 解数独 | Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  2. Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...

  3. 【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)

    Github项目地址:https://github.com/MokouTyan/suduku_131700101 [2019.09.20]更新:代码经过Code Quality Analysis工具的 ...

  4. Project Euler 96:Su Doku 数独

    Su Doku Su Doku (Japanese meaning number place) is the name given to a popular puzzle concept. Its o ...

  5. NOIP2009 靶形数独

    4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...

  6. Muduo 多线程模型:一个 Sudoku 服务器演变

    陈硕 (giantchen AT gmail) blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category ...

  7. 靶形数独 (dfs+预处理+状态压缩)

    #2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...

  8. 利用程序随机构造N个已解答的数独棋盘

    高级软件工程第二次作业:利用程序随机构造N个已解答的数独棋盘,代码如下: package SudokuGame; /** * 解决这个问题使用的是回溯+剪枝的算法 * 基本思想:不断地将每个格子可填入 ...

  9. C# 开源框架

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...

随机推荐

  1. RobotFrameWork接口报文测试-----(三)demo的加强版(数据驱动测试)

    在上一篇RobotFrameWork接口报文测试-----(二)demo的升级版基础上,将接口的xml的格式保存在xml文件中,然后程序如果增加一个接口,在xml文件里添加即可,无需修改自动化测试里的 ...

  2. MySQL函数汇总

    前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...

  3. CentOS:安装桌面GNOME图形化界面

    u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...

  4. django models数据类型

    Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...

  5. JSP中文乱码问题解决方法小结

    在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱 码问题以及解决方法. 1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要 ...

  6. Oracle将表keep到内存

    一.引言: 有时候一些基础表需要非常的频繁访问,尤其是在一些循环中,对该表中的访问速度将变的非常重要.为了提高系统的处理性能,可以考虑将一些表及索引读取并保存到内存中. 二.关于keep内存的几个参数 ...

  7. JavaEE基础(三)

    1.Java语言基础(逻辑运算符的基本用法) A:逻辑运算符有哪些 &,|,^,! &&,|| B:案例演示 逻辑运算符的基本用法 注意事项: a:逻辑运算符一般用于连接boo ...

  8. C#:插件、框架

    1.开源实体映射框架EmitMapper(http://www.cnblogs.com/wuhong/archive/2011/09/21/2184313.html) 2.ffmpeg.exe是一个源 ...

  9. jquery中用jqzoom实现放大镜效果

    使用的jqzoom 插件实现的放大镜的效果 jqzoom 里面的代码 : 直接copy就好 //**************************************************** ...

  10. ACM第四站————最小生成树(普里姆算法)

    对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...