数独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, 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的更多相关文章
- [Swift]LeetCode37. 解数独 | Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- Vijos1755 靶形数独 Sudoku NOIP2009 提高组 T4 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求这个数独中所有的解法中的最大价值. 一个数独解法的价值之和为每个位置所填的数值 ...
- 【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)
Github项目地址:https://github.com/MokouTyan/suduku_131700101 [2019.09.20]更新:代码经过Code Quality Analysis工具的 ...
- Project Euler 96:Su Doku 数独
Su Doku Su Doku (Japanese meaning number place) is the name given to a popular puzzle concept. Its o ...
- NOIP2009 靶形数独
4.靶形数独 (sudoku.pas/c/cpp) [问题描述] 小城和小华都是热爱数学的好学生, 近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了, ...
- Muduo 多线程模型:一个 Sudoku 服务器演变
陈硕 (giantchen AT gmail) blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category ...
- 靶形数独 (dfs+预处理+状态压缩)
#2591. 「NOIP2009」靶形数独 [题目描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们 ...
- 利用程序随机构造N个已解答的数独棋盘
高级软件工程第二次作业:利用程序随机构造N个已解答的数独棋盘,代码如下: package SudokuGame; /** * 解决这个问题使用的是回溯+剪枝的算法 * 基本思想:不断地将每个格子可填入 ...
- C# 开源框架
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...
随机推荐
- Openstack的的nova list命令
nova list用于在shell交互模式下查看当前用户存在的实例数目,但是这里仍然要注意的地方: 没有参数的nova list [root@node-5 newstest-master]# nova ...
- MAC常用快捷键
1.F11 用于当前界面与桌面进行切换,Command-M 最小化窗口,Option-Command-M 最小化所有窗口,Command-数字 切换数字指定的网页列表 Shift-Command-D ...
- word2007里插入分节符
1.打开Word文档,将鼠标定位到需要插入分页符的位置(比如第2页的末尾处),切换到"页面布局"功能区. 2.在"页面设置"分组中单击"分隔符&quo ...
- linux下xargs命令用法详解 【转】
转自:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...
- Content Delivery Network
Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总
- [转]Windows配置Git
原文地址:http://blog.csdn.net/exlsunshine/article/details/18939329 1.从git官网下载windows版本的git:http://git-sc ...
- Multi-source Replication
MariaDB starting with 10.0.1 Multi-source replication means that one server has many masters from wh ...
- DOS下如何同时显示时区日期和时间
DOS下如何同时显示时区日期和时间 Echo %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% 不显示周几 Echo %Date: ...
- Hadoop Balance
一.hadoop balance工具的用法: 启动balance: bin/start-balancer.sh -threshold 5 停止balance: bin/stop-balancer.sh ...
- quick lua 3.3常用方法和学习技巧之functions.lua目录
1.functions.lua (framework->functions.lua) 提供一组常用函数,以及对 Lua 标准库的扩展 1.printf 2.checknumber checkin ...