问题描述

你一定听说过“数独”游戏。

如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

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

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

输出9行,每行9个数字表示数独的解。

例如:

输入(即图中题目):

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗 < 2

问题分析

遍历整个棋盘,遇到有数字的直接跳过,没数字的就把1-9都放一遍,判断是否合适,如果合适就执行下一个位置,不合适该位置继续枚举下一个数字,假如9个数都不合适就抠掉该位置上的数回到上一步继续枚举,直到整个棋盘遍历完,答案便出来了。

代码实现

深度优先搜索+回溯算法

import java.util.Scanner;

public class SudokuGame {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

//定义棋盘

char[][] table = new char[9][9];

//初始化棋盘

for (int i = 0; i < 9; i++) {

table[i] = sc.nextLine().toCharArray();

}

//深度优先搜索

dfs(table, 0, 0);

}

/**

* 深度优先搜索遍历整个棋盘

* @param table棋盘

* @param i横坐标

* @param j纵坐标

*/

private static void dfs(char[][] table, int i, int j) {

if (i == 9) {

print(table);

//数独游戏都是唯一的,直接退出程序即可

System.exit(0);

}

if (table[i][j] == '0') {//该位置没有数字,枚举1-9放入

for (int k = 1; k <= 9; k++) {

if (judge(table, i, j, k)) {//判断该位置是否能放这个数

table[i][j] = (char)('0' + k);

dfs(table, i + (j + 1) / 9, (j + 1) % 9);

}

}

table[i][j] = '0';

} else {//该位置已经有数,就直接跳过

dfs(table, i + (j + 1) / 9, (j + 1) % 9);

}

}

private static void print(char[][] table) {

for (int i = 0; i < 9; i++) {

System.out.println(table[i]);

}

}

/**

* 判断该位置是否可以放k这个数字

* @param table棋盘

* @param i横坐标

* @param j纵坐标

* @param k被判断的数字

* @return

*/

private static boolean judge(char[][] table, int i, int j, int k) {

//判断本行,本列是否有相同的数

for (int m = 0; m < 9; m++) {

if (table[m][j] == '0' + k || table[i][m] == '0' + k) {

return false;

}

}

//判断该同色区域是否有相同的数

for (int m = (i / 3) * 3; m < (i / 3) * 3 + 3; m++) {

for (int n = (j / 3) * 3; n < (j / 3) * 3 + 3; n++) {

if (table[m][n] == '0' + k) {

return false;

}

}

}

return true;

}

}

数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯相关推荐

  1. 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)

    第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...

  2. 标题 错误票据c语言,内含答案的 -- 2013蓝桥杯C语言本科组B.doc

    内含答案的 -- 2013蓝桥杯C语言本科组B.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们 ...

  3. 第七届蓝桥杯C语言C组-(自己懂的题目)

    第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...

  4. 数组三元数c语言程序,递增三元数组——第九届蓝桥杯C语言B组(省赛)第六题...

    原创 标题:递增三元组 给定三个整数数组 A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN], 请你统计有多少个三元组(i ...

  5. 换个格式输出整数 蓝桥杯 C语言

    换个格式输出整数 蓝桥杯 C语言 描述: 让我们用字母B来表示"百".字母S表示"十",用12-n来表示不为零的个位数字n(<10),换个格式来输出任一个 ...

  6. 蓝桥杯 C语言训练【1952】——求长方形面积

    蓝桥杯 C语言训练[1952]--求长方形面积 1.题目要求: 输入一个长方形的长和宽(整数),输出该长方形的周长C和面积S,要求格式如例(请注意打印"C:"."S:&q ...

  7. 蓝桥杯-c语言 打印十字图

    打印十字图 题目描述: 问题描述小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$ ...

  8. c语言填字母游戏蓝桥杯,蓝桥杯2017国赛JAVAB组 填字母游戏 题解

    标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...

  9. 蓝桥杯 算法提高 转圈游戏 JAVA

    蓝桥杯 转圈游戏 原题描述 解题思路 JAVA代码 运行结果 原题描述 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 ...

最新文章

  1. linux shell 字符串操作(长度,查找,替换)详解
  2. 刷题总结——烽火传递(单调队列+dp)
  3. 二倍图三倍图什么意思_搞笑GIF图:搞笑GIF图:平安夜为什么见不到“圣诞老人”...
  4. C# Owin 创建与测试自己的中间件Middleware
  5. 小证明题 编译原理--题目原型:
  6. 用c语言写出一个榜单程序,C语言依然位居榜单前列,依然值得程序员学习
  7. cvc 降噪_哪款蓝牙耳机降噪效果最好,降噪音质俱佳的蓝牙耳机推荐
  8. 【C++】在控制台上跳极乐净土-easyX简单音乐及动画
  9. 使用Python脚本进行批量造数据
  10. Class 'app\index\controller\News' not found 解决方案
  11. Kafka学习笔记 --- 生产者producer与消费者关系comsumer
  12. QT项目之键盘控制光标移动
  13. 五类千万不要吃的动物部位
  14. 主板cpu盖板怎么盖回去
  15. C语言二进制与十进制互相转换的方法和示例
  16. 计算机16套常考真题,计算机二级16套精选真题020真题20
  17. 《剩女郎》的艺术魅力
  18. RTOS中的消息队列的原理以及应用
  19. 如何配置log4j2日志记录至数据库
  20. wms仓库管理系统,进销存和ERP系统三者之间联系

热门文章

  1. java错误:java.lang.IncompatibleClassChangeError: Implementing class
  2. The Response content must be a string or object implementing __toString(), “boolean“ given
  3. 罗技G29+Carla+实车twist三者互相控制以及三者联调
  4. SMBMS(超市管理系统)
  5. 信号与系统——连续时间信号的基础运算方法(二)
  6. 让IE浏览器打开时默认最大化
  7. 电磁流量计流量偏大怎么办
  8. FMCW雷达测距、测速与测角
  9. 牛客网 剑指offer JZ47 礼物的最大价值 Python 动态规划
  10. MongoDB 练习