数独游戏-蓝桥杯-C语言,数独游戏_java_深搜+回溯
问题描述
你一定听说过“数独”游戏。
如【图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_深搜+回溯相关推荐
- 蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)
第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...
- 标题 错误票据c语言,内含答案的 -- 2013蓝桥杯C语言本科组B.doc
内含答案的 -- 2013蓝桥杯C语言本科组B.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们 ...
- 第七届蓝桥杯C语言C组-(自己懂的题目)
第七届蓝桥杯C语言C组-(自己懂的题目) 表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结, 先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级... 第一题 报纸页数 X星球 ...
- 数组三元数c语言程序,递增三元数组——第九届蓝桥杯C语言B组(省赛)第六题...
原创 标题:递增三元组 给定三个整数数组 A = [A1, A2, ... AN], B = [B1, B2, ... BN], C = [C1, C2, ... CN], 请你统计有多少个三元组(i ...
- 换个格式输出整数 蓝桥杯 C语言
换个格式输出整数 蓝桥杯 C语言 描述: 让我们用字母B来表示"百".字母S表示"十",用12-n来表示不为零的个位数字n(<10),换个格式来输出任一个 ...
- 蓝桥杯 C语言训练【1952】——求长方形面积
蓝桥杯 C语言训练[1952]--求长方形面积 1.题目要求: 输入一个长方形的长和宽(整数),输出该长方形的周长C和面积S,要求格式如例(请注意打印"C:"."S:&q ...
- 蓝桥杯-c语言 打印十字图
打印十字图 题目描述: 问题描述小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:..$$$$$$$$$$$$$.. ..$...........$.. $$$.$$$$$$$$$.$$ ...
- c语言填字母游戏蓝桥杯,蓝桥杯2017国赛JAVAB组 填字母游戏 题解
标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
- 蓝桥杯 算法提高 转圈游戏 JAVA
蓝桥杯 转圈游戏 原题描述 解题思路 JAVA代码 运行结果 原题描述 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 ...
最新文章
- linux shell 字符串操作(长度,查找,替换)详解
- 刷题总结——烽火传递(单调队列+dp)
- 二倍图三倍图什么意思_搞笑GIF图:搞笑GIF图:平安夜为什么见不到“圣诞老人”...
- C# Owin 创建与测试自己的中间件Middleware
- 小证明题 编译原理--题目原型:
- 用c语言写出一个榜单程序,C语言依然位居榜单前列,依然值得程序员学习
- cvc 降噪_哪款蓝牙耳机降噪效果最好,降噪音质俱佳的蓝牙耳机推荐
- 【C++】在控制台上跳极乐净土-easyX简单音乐及动画
- 使用Python脚本进行批量造数据
- Class 'app\index\controller\News' not found 解决方案
- Kafka学习笔记 --- 生产者producer与消费者关系comsumer
- QT项目之键盘控制光标移动
- 五类千万不要吃的动物部位
- 主板cpu盖板怎么盖回去
- C语言二进制与十进制互相转换的方法和示例
- 计算机16套常考真题,计算机二级16套精选真题020真题20
- 《剩女郎》的艺术魅力
- RTOS中的消息队列的原理以及应用
- 如何配置log4j2日志记录至数据库
- wms仓库管理系统,进销存和ERP系统三者之间联系
热门文章
- java错误:java.lang.IncompatibleClassChangeError: Implementing class
- The Response content must be a string or object implementing __toString(), “boolean“ given
- 罗技G29+Carla+实车twist三者互相控制以及三者联调
- SMBMS(超市管理系统)
- 信号与系统——连续时间信号的基础运算方法(二)
- 让IE浏览器打开时默认最大化
- 电磁流量计流量偏大怎么办
- FMCW雷达测距、测速与测角
- 牛客网 剑指offer JZ47 礼物的最大价值 Python 动态规划
- MongoDB 练习