数独游戏

  • 题目描述
  • 代码展示
  • 拓展问题

题目描述

玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列 均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求:
输入9行,每行9个字符,0代表未知,其它数字为已知。
输出9行,每行9个数字表示数独的解。

代码展示

import java.util.Scanner;public class Main {static int[][] matrix;public static void main(String[] args) {Scanner sc = new Scanner(System.in);matrix = new int[9][9];// 初始化矩阵,0:代表空位for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {matrix[i][j] = sc.nextInt();}}System.out.println("------------------");dfs(0, 0);}// 深度遍历,一行一行开始public static void dfs(int i, int j) {// 递归结束,到第10行if (i == 9) {printResult();System.exit(0);  // 程序结束,否则一直打印结果,因为递归深度太深}// 如果当前 i行 j列 是 0即空位置,则将 1-10分别试着放入空位,假如放入,判断第i行第j列是否存在该数字if (matrix[i][j] == 0) {for (int k = 1; k < 10; k++) {// 如果不存在,则将该数字放入,从该行下一列开始,继续试着填充// i+(j+1)/9, (j+1)%9 巧妙的实现,遍历一行,遍历完了换到下一行if (!check(i, j, k)) {// 如果将当前位置i,j 先初步设置为了 k,试着往下继续递归填数// 可能遇到某一个位置,不能继续填数了,因为行列有重复,无法填值成功,则当前栈中方法逐步出栈,直到回溯错误的填数位置matrix[i][j] = k;dfs(i+(j+1)/9, (j+1)%9);}}// 回溯过程中需要,复位matrix[i][j] = 0;} else {dfs(i+(j+1)/9, (j+1)%9);}}// 检查 i行 j列 是否已存在 numpublic static boolean check(int i, int j, int num) {for (int k = 0; k < 9; k++) {if (matrix[i][k] == num || matrix[k][j] == num) {return true;}}return false;}// 输出结果public static void printResult() {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(matrix[i][j]+" ");}System.out.println();}}
}

输入:

0 0 8 0 7 0 6 0 0
0 1 0 5 6 0 0 0 0
0 2 0 0 0 0 0 0 1
0 6 0 0 0 0 0 0 0
5 7 1 0 3 0 4 9 8
0 0 0 0 0 0 0 7 0
4 0 0 0 0 0 0 6 0
0 0 0 0 4 3 0 5 0
0 0 3 0 5 0 2 0 0


输出

1 3 8 2 7 5 6 4 9
2 1 4 5 6 7 9 8 3
6 2 5 4 8 9 7 3 1
3 6 7 1 9 4 8 2 5
5 7 1 6 3 2 4 9 8
8 4 9 3 2 1 5 7 6
4 5 2 9 1 8 3 6 7
7 9 6 8 4 3 1 5 2
9 8 3 7 5 6 2 1 4

拓展问题

问题描述

给定数列 a,判断是否可以从中选出若干个数,使他们的和恰好为 k。

例如:
输入:
n=4
a={1,2,4,7}
k=13
输出:
Yes

分析:

由于数列中每个数存在加或者不加两种状态,那么可绘制二叉状态树如下:

因此考虑使用递归算法求解。

代码展示:

import java.util.Scanner;public class _23_数独问题2 {static int[] a;static int k;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();k = sc.nextInt();a = new int[n];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}if (dfs(0, k))System.out.println("Yes");elseSystem.out.println("No");}// 深度遍历public static boolean dfs(int i, int curSum) {// 递归结束条件if (i+1 == a.length) {return curSum + a[i] == k;}// 剪枝,减少不必要的递归,优化效率// 如果当前未到数组末尾,但是已经满足sum==k || sum > k,直接跳出,返回相应结果if (curSum >= k) {return curSum == k;}// 对于当前 数可以选择也可以放弃// 选择走二叉树左分支if (dfs(i+1, curSum+a[i]))return true;// 不选择走有分支if (dfs(i+1, curSum))return true;// 若左右分支都不满足,则回溯时返回 falsereturn false;}
}

参考博客 Link

感谢

数独问题(Java版)相关推荐

  1. 数独游戏java版(一)--核心算法

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种 ...

  2. 数独的Java版解法

    最近偶尔有玩数独,有的题太复杂了不好解,刚好看到LeetCode上有这样的题,就尝试写了个Java的解法. 1. 数独介绍 数独盘面是个九宫,每一宫又分为九个小格.在这八十一格中给出一定的已知数字和解 ...

  3. java 数独算法_java版数独游戏核心算法(一)

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种 ...

  4. 9 9简单的数独游戏python,python实现数独游戏 java简单实现数独游戏

    使用python和java实现数独游戏,有比较才有收获哦. 1.Python版 #--coding:utf-8-- import random import itertools from copy i ...

  5. hmcl离线登陆_最好用的Java版启动器HMCL

    原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...

  6. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  7. 分布式主键解决方案----Twitter 雪花算法的原理(Java 版)

    SnowFlake 雪花算法 对于分布式系统环境,主键ID的设计很关键,什么自增intID那些是绝对不用的,比较早的时候,大部分系统都用UUID/GUID来作为主键,优点是方便又能解决问题,缺点是插入 ...

  8. 我的世界java下载1.13_Minecraft Java版 1.13.1-pre2 发布

    Minecraft Java 版 1.13.1-pre2 发布 Back from vacation, we're now trying to finalize 1.13.1 and get it t ...

  9. 我的世界java版不会玩_我的世界:五张MC趣图,Java版玩家永远不懂基岩版玩家的痛...

    <我的世界>1.17版本目前已经更新了8个快照版本,在玩家的期望中,Mojang总算是加入了新的洞穴--噪声洞穴(Noise Caves).虽然这属于洞穴与山崖更新的一大步,Java版玩家 ...

  10. 我的世界1.7.2 java_我的世界Java版1.7版本种子分享

    我的世界Java版的1.7版本中有哪些好的种子呢?下面就给大家带来我的世界Java版1.7版本种子分享,以供玩家参考. 1.seed:-6281771182477298288 x:74 y:68 z: ...

最新文章

  1. amd的处理器能兼容idea么_250元就能买到16GB内存 这背后究竟是道德的沦丧还是人性的扭曲?...
  2. 【机器学习】微软出品!FLAML:一款可以自动化机器学习过程的神器!
  3. ArrayList用法说明
  4. RaabitMQ:rabbitmqctl的几个命令
  5. POJ 3126-Prime Path
  6. opencv mat赋值_opencv-python 关于位操作
  7. php yii结果集合并,PHP 基础之数组合并
  8. BZOJ4832: [Lydsy2017年4月月赛]抵制克苏恩
  9. webbrowser1 脚本报错_webbrowser脚本错误的解决办法
  10. 如何使用计算机读文本,如何使用StrokeIt
  11. Mysql数据库版本高低引起的group by问题
  12. 2007中文网志年会印象
  13. Entity Framework入门
  14. linux过滤目录文件,SCP使用技巧-递归排除文件
  15. 2019杭电计算机考研经验贴(初试+复试)
  16. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
  17. 什么?Sentinel流控规则可以这样玩?
  18. 字典学习/稀疏表示学习笔记
  19. P4学习——p4runtime
  20. 数据库:CHAR,VARCHAR,TEXT,ENUM ,SET,BINARY,VARBINARY 列的完整性约束

热门文章

  1. 8月5日 网工学习 CRC校验码 HDLC协议
  2. ug五轴编程视频教程
  3. 蒙特卡罗奇异值谱分析
  4. 欧姆龙e5dc温控器_E5DC-QX2DSM-800手册欧姆龙 数字温度控制器E5DC-QX2DSM-800用户手册 - 广州凌控...
  5. ProgeCAD 2009 Pro 9.0.26.6 (建筑CAD)iv.rar
  6. android autojs 群控 脚本,autojs开发群控需要用到的服务器通信协议websocket例子
  7. C++面向对象三大特性
  8. Oracle数据库对象
  9. 数据通信技术初级工程师
  10. U盘启动盘安装系统,使用Diskpart命令对磁盘进行分区