7.12dfs例题:数独游戏

dfs:深度优先搜索(深搜)
思路是把一种可能性走到底,在回头到上一个路口,走另一种可能性。

数独游戏:
有一个9个3*3的小格子,拼成了一个9*9的矩阵,预输入1~9这种数字到某个格子上,其余格子是0。
我们要做的就是把没有数字的格子上添上数字,使得这个9*9的矩阵每一行每一列的数字都是1~9不重复,并且9个3*3的小矩阵中,这9个数字也只能是1~9不允许重复。

思路:
1.定义一个char类型的二维数组用来存储9*9的矩阵,将输入字符串转换为一个字符数组存入。
2.dfs方法:如果当前[x][y]位置的数为0,则从1~9中挨个试填数字,如果填入的数字满足行列1~9不重复,并且当前3*3小矩阵1~9不重复,则可以填入,然后递归,传入下一个x和y位置,x的位置应该是x+(y+1)/9,y的位置应该是(y+1)%9。如果当前[x][y]位置的数不为0,则直接递归,传入下一个x和y位置。递归退出条件为x==9时。打印矩阵,终止程序。

 1 public class Seven_12dfs例题数独游戏 {
 2     private static void dfs(char[][] table, int x, int y) {
 3         if (x == 9) {
 4             print(table);
 5             System.exit(0);
 6         }
 7         if (table[x][y] == ‘0‘) {
 8             // 选择1~9之间合法的数字填到x,y这个位置
 9             for (int k = 1; k < 10; k++) {
10                 if (check(table, x, y, k)) {
11                     table[x][y] = (char) (‘0‘ + k);
12                     dfs(table, x + (y + 1) / 9, (y + 1) % 9); // 处理下一个状态
13                 }
14             }
15             table[x][y] = ‘0‘; // 回溯
16         } else {
17             // 如果当前位置有数字了,则继续找下一个需要处理的位置
18             dfs(table, x + (y + 1) / 9, (y + 1) % 9);
19         }
20     }
21
22     public static boolean check(char[][] table, int i, int j, int k) {
23         // 检查同行和同列
24         for (int l = 0; l < 9; l++) {
25             if (table[i][l] == (char) (‘0‘ + k))
26                 return false;
27             if (table[l][j] == (char) (‘0‘ + k))
28                 return false;
29         }
30         for (int l = (i / 3) * 3; l < (i / 3 + 1) * 3; l++) {
31             for (int m = (j / 3) * 3; m < (j / 3 + 1) * 3; m++) {
32                 if (table[l][m] == (char) (‘0‘ + k))
33                     return false;
34             }
35         }
36         return true;
37     }
38
39     private static void print(char[][] table) {
40         for (int i = 0; i < 9; i++) {
41             System.out.println(new String(table[i]));
42         }
43     }
44
45     public static void main(String[] args) {
46         Scanner sc = new Scanner(System.in);
47         char[][] table = new char[9][9];
48         for (int i = 0; i < 9; i++) {
49             table[i] = sc.nextLine().toCharArray();
50         }
51         dfs(table, 0, 0);
52     }
53 }

原文地址:https://www.cnblogs.com/z1110/p/12604628.html

时间: 2024-10-18 16:16:09

7.12dfs例题:数独游戏的相关文章

数独游戏求解程序

最近玩数独游戏,每行.每列.以及9宫格都包含1-9个数组.觉得这东西很适合用程序来求解.于是我就仿照中国象棋的暴力搜索算法(可参考我之前写的文章极大极小搜索算法),写了一个程序求解数独,直接贴代码了 /** * 模仿象棋程序的搜索算法,写一个求解数独的程序 * @author royhoo * */ public class ShuDu { private int[][] board; // 数独矩阵 private int zeroNum; // 缺失的数字个数 private int fil

数独游戏的设计与实现

前景:数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 然而如何制作出这个游戏?首先要了解它的规则: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件:在空

5乘5的数独游戏

用了三个周的业余时间,日思夜想的牵挂才把5乘5的数独游戏填满了二十五个宫格. 在这前一篇<数独游戏新篇章>里面,通过对第一个宫格使用位移变换来得到后面的二十四个宫格,总觉得没有什么意思.现在可以通过回溯的办法填满整个二十五个宫格,又觉得这样的结果好像120个点的连通图里面的哈密顿回路的条数那样多得不可思议,所以就想在一个已经填入了一部分数字的情况下,再把其余的格子填满,因为已经有了可以解决3乘3标准数独的基础(前一篇那一个是芬兰数学家给出的世界最难标准数独,编写的程序运行十小时就能得到结果,就

android数独游戏

最近没事干,照着视频教程写了一个数独游戏,很粗糙还有很多要修改的地方.下面就来说说这个游戏吧 1.自定义一个View控件,用来在屏幕上显示一个9*9的格子,其实就是横着画8条线,竖着画8跳线,然后将其中的几条线加粗一下.这样就形成了9*9的格子了 2.用一个字符串初始化游戏界面上的数字 1 String str_int = "360000000004230800000004200"+ 2 "070460003820000014500013020"+ 3 "

C语言学习 数独游戏

摘要:花了1周多时间学习了C语言,开始练手写解数独游戏的程序. 作者:乌龙哈里 时间:2015-11-22 平台:Window7 64bit,TCC 0.9.26(x86-64 Win64) 参考: 互动百科 数独 章节: 正文: 原来也用C#和Go语言写过,主要思路是暴力撞大运破解.思路什么的在程序了都注释了,不多说了.可能是没用什么先进的算法,感觉C解题速度和C#差不多(除了C#第一次运行之外),基本上出来一个数独表都不用1秒. 附完整程序: 1 /*********************

数独游戏算法

# #author:wuhao # #解数独游戏 # #想法:从(0,0)开始往下遍历,(当然从什么位置开始遍历是无所谓的,只是代码写法可能要有点变化,我是从(0,0)开始往下逐层遍历),首先判断其是否需要填值check(a,i,j),如果需要填值就填上其可能的值保存在FillData(a,i,j),返回的是一个list存放的是其可能的值,最后进行遍历查找正确的结果 check函数: def check(a,i,j): if a[i][j]==0: return True return Fals

数独游戏代码

//数独游戏c++ class CSudoku { int map[9][9]; int blanks; int smod; int solves; int check(int,int,int*); void dfs(); public: enum{ANY=0,ALL=1}; CSudoku(int); CSudoku::CSudoku(int *data); void SudokuGenerator(int); //随机生成数独,n越大越难 void SudokuGenerator(int *

【QT学习】数独游戏

前几天刷leetcode刷到一题,讲sudokuSolver,写完感觉很有意思,遂想做一个数独游戏,百度了一下如何自动生成题库,参考某位大神安卓下的实现思路,自己做了一套文字版的数独游戏,后来想乘机会学一下QT于是完成了图形界面的数独.先mark一下之后从数独解题,数独出题,QT图形界面来讲讲自己的心得体会. 界面写完是这样的.也算有点小成就感了. 游戏链接+QT运行动态库 http://pan.baidu.com/s/1kTu5alh

安卓开发_数独游戏基础(二)

老师视频教程结束了,但是游戏并未完成.下面便开始自己动手完善部分功能 需要完善的功能: 1.设置给定的数独数据数字不可改变 2.设置给定的数独数据数字和玩家填入的数字颜色不同,方便区分 3.判断填写后的数独是否符合数独游戏规则 解决方法: 1.设置给定的数独数据数字不可改变 我的思路,因为给定的数据数字是给定的,而数据是放在一个字符串里的,如下:0代表需要玩家输入的,非0则是给定的 1 private final String str = "061030020050008107000007034