数独(すうどく,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. zw版_Halcon-delphi系列教程_卫星航拍精确打击目标自动识别

    <zw版·Halcon-delphi系列原创教程> 卫星航拍精确打击目标自动识别 这几天,俄罗斯空军在叙利亚大显神威,美军有意见了,说俄罗斯是狂轰滥炸,不是精确打击.      不过,战斗 ...

  2. yii2中textarea中的默认值设置

    1. view中显示文本域的位置 <?= $form->field($goods_model, 'goods_introduce')->textArea(['class'=>' ...

  3. IE和FF区别关于css和js

    css 1.ul标签FF中有padding值,没有margin,IE中相反 解决办法:将ul的padding和margin都设为0, js 1.IE中innerText在火狐中没有,使用textCon ...

  4. Controller 接口控制器详解

    Controller 控制器,是 MVC 中的部分 C,为什么是部分呢?因为此处的控制器主要负责功能处理部分:1.收集.验证请求参数并绑定到命令对象:2.将命令对象交给业务对象,由业务对象处理并返回模 ...

  5. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...

  6. SQL Server 索引视图 聚簇索引

    创建示例: 朋友的网站速度慢,让我帮忙看下,他用的SQL Server里面 有一个文章表里面有30多万条记录 还有一个用户表里面也差不多17万记录 偏偏当初设计的时候没有冗余字段 很多帖子信息需要JO ...

  7. 装多系统删除某个系统后,如何恢复ubuntu引导

    在重装系统或者再装多个系统后可能会出现ubuntu的引导文件不存在的情况,windows系列的引导文件可以用winpe修复,但是ubuntu就不可以,虽然网上很多种修复ubuntu的引导文件 方式,但 ...

  8. ServiceStack.Redis 使用教程

    http://www.cnblogs.com/shanyou/archive/2011/11/10/2245082.html https://github.com/ServiceStack/Servi ...

  9. PHP学习当中遗漏的知识点

    一, 当双引号中包含变量时,变量会与双引号中的内容连接在一起: 当单引号中包含变量时,变量会被当做字符串输出. <?php $love = "I love you!"; $s ...

  10. 线程和进程详解(以java为例具体说明)

    详细参见http://ifeve.com/java-concurrency-thread-directory/ 一.线程概述 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早 ...