数独(すうどく,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. Openstack的的nova list命令

    nova list用于在shell交互模式下查看当前用户存在的实例数目,但是这里仍然要注意的地方: 没有参数的nova list [root@node-5 newstest-master]# nova ...

  2. MAC常用快捷键

    1.F11 用于当前界面与桌面进行切换,Command-M 最小化窗口,Option-Command-M 最小化所有窗口,Command-数字 切换数字指定的网页列表 Shift-Command-D ...

  3. word2007里插入分节符

    1.打开Word文档,将鼠标定位到需要插入分页符的位置(比如第2页的末尾处),切换到"页面布局"功能区. 2.在"页面设置"分组中单击"分隔符&quo ...

  4. linux下xargs命令用法详解 【转】

    转自:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...

  5. Content Delivery Network

    Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总

  6. [转]Windows配置Git

    原文地址:http://blog.csdn.net/exlsunshine/article/details/18939329 1.从git官网下载windows版本的git:http://git-sc ...

  7. Multi-source Replication

    MariaDB starting with 10.0.1 Multi-source replication means that one server has many masters from wh ...

  8. DOS下如何同时显示时区日期和时间

    DOS下如何同时显示时区日期和时间 Echo %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% 不显示周几 Echo %Date: ...

  9. Hadoop Balance

    一.hadoop balance工具的用法: 启动balance: bin/start-balancer.sh -threshold 5 停止balance: bin/stop-balancer.sh ...

  10. quick lua 3.3常用方法和学习技巧之functions.lua目录

    1.functions.lua (framework->functions.lua) 提供一组常用函数,以及对 Lua 标准库的扩展 1.printf 2.checknumber checkin ...