当前位置: 首页 > news >正文

教您如何申请企业邮箱/人员优化方案

教您如何申请企业邮箱,人员优化方案,简历模板免费下载wps,做电商平台网站有哪些内容有没有对数独感兴趣的朋友呢?数独作为一款经典的逻辑游戏,其目标是在一个9x9的方格中填入数字1至9,确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单,但编写一个能够自动求解数独的程序…

_20250314_222542.png

有没有对数独感兴趣的朋友呢?数独作为一款经典的逻辑游戏,其目标是在一个9x9的方格中填入数字1至9,确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单,但编写一个能够自动求解数独的程序却是一项颇具挑战性的任务。本文将深入探讨如何运用回溯算法来实现数独的自动求解。

wps_f4zzDJ7hhN.png

数独求解算法及步骤

我们使用一个二维数组来表示数独的表格,空位置填充0。

数独求解的核心算法是回溯算法。回溯算法是一种通过逐步构建解决方案并在遇到冲突时回退的算法。具体来说,我们尝试在空格中填入一个数字,然后递归地继续填充下一个空格。如果在某个步骤中发现无法继续填充,则回退到上一步并尝试其他数字。

  • 算法步骤
  1. 寻找空格:我们循环数独的所有单元格,如果数组的值为0的话则此格未填写数字。

  2. 尝试填入数字:对于这个空格,尝试填入1到9中的一个数字。

  3. 检查数字的正确性:检查填入的数字是否与当前行、列和3x3子网格中的数字有重复。

  4. 递归求解:如果没有重复,则递归地继续填充下一个空格。

  5. 回溯:如果在某个步骤中发现无法继续填充,则回退到上一步并尝试其他数字。

Java代码实现

我们使用一个二维数组来表示数独,有一种只求解数独的方法及求解不是唯一解的所有可行解的方法。代码如下


/*** 数独求解*/
public class SudokuSolver {/*** 检查数独元素的正确性,及每行、每列、每九宫格的唯一性*/public static boolean checkValue(int[][] sudoku,int value,int row,int col){//检验当前元素所在行for (int i = 0; i < 9; i++) {if(sudoku[row][i] == value){return false;}}//检验当前元素所在列for (int i = 0; i < 9; i++) {if(sudoku[i][col] == value){return false;}}//检验当前元素所在九宫格for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {// 如果当前元素所在九宫格有值,则返回falseif(sudoku[row/3*3+i][col/3*3+j] == value){return false;}}}return true;};/*** 回溯算法求解数独*/public static boolean solveSudokuSingleSec(int[][] sudoku) {//递归回溯法求解数独,循环遍历81个元素,如果当前元素为0,则尝试1-9的值,如果符合要求,则递归求解,否则返回上一层继续尝试for (int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++){//如果当前元素为0,则尝试1-9的值,如果符合要求,则递归求解,否则返回上一层继续尝试if(sudoku[i][j]== 0){for (int k =1;k<=9;k++){//如果符合要求,则递归求解,否则返回上一层继续尝试if(checkValue(sudoku,k,i,j)){sudoku[i][j] = k;if(solveSudokuSingleSec(sudoku)){return true;}// 回溯sudoku[i][j] = 0;}}// 无法继续填充,则回退到上一步并尝试其他数字。return false;}}}// 找到一个解,则返回true,无需继续回溯return true;}/***回溯算法求解数独的所有可能解*/public static void solveSudokuSec(int[][] sudoku, List<int[][]> result) {// 递归回溯法求解数独,循环遍历81个元素,如果当前元素为0,则尝试1-9的值,如果符合要求,则递归求解,否则返回上一层继续尝试for (int i = 0; i < 9; i++) {for(int j = 0; j < 9; j++){if(sudoku[i][j]== 0){for (int k =1;k<=9;k++){if(checkValue(sudoku,k,i,j)){sudoku[i][j] = k;// 递归求解solveSudokuSec(sudoku,result);// 回溯sudoku[i][j] = 0;}}// 无法继续填充,则回退到上一步并尝试其他数字。return;}}}// 找到一个解,记录并添加到集合中int[][] resultArray = new int[9][9];for (int row = 0; row < 9; row++) {System.arraycopy(sudoku[row], 0, resultArray[row], 0, 9);}result.add(resultArray);}public static void main(String[] args) {int[][] initArraySingle = new int[][]{{8,0,0,0,0,0,0,0,0},{0,0,3,6,0,0,0,0,0},{0,7,0,0,9,0,2,0,0},{0,5,0,0,0,7,0,0,0},{0,0,0,0,4,5,7,0,0},{0,0,0,1,0,0,0,3,0},{0,0,1,0,0,0,0,6,8},{0,0,8,5,0,0,0,1,0},{0,9,0,0,0,0,4,0,0}};int[][] initArray = new int[][]{{8,0,0,0,0,0,0,0,0},{0,0,3,6,0,0,0,0,0},{0,7,0,0,9,0,2,0,0},{0,8,0,0,0,7,0,0,0},{0,0,0,0,4,5,7,0,0},{0,0,0,1,0,0,0,3,0},{0,0,1,0,0,0,0,6,8},{0,0,8,5,0,0,0,1,0},{0,9,0,0,0,0,4,0,0}};// 回溯算法求解数独solveSudokuSingleSec(initArraySingle);for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(initArraySingle[i][j]+" ");}System.out.println();}List<int[][]> result = new ArrayList<>();// 回溯算法求解数独的所有可能解solveSudokuSec(initArray,result);System.out.println("共"+result.size()+"种解法");for (int i = 0; i < result.size(); i++){System.out.println("解法"+(i+1)+":");for (int j = 0; j < 9; j++) {for (int k = 0; k < 9; k++) {System.out.print(initArraySingle[j][k]+" ");}System.out.println();}};}}

求解结果如下:

8 1 2 7 5 3 6 4 9 
9 4 3 6 8 2 1 7 5 
6 7 5 4 9 1 2 8 3 
1 5 4 2 3 7 8 9 6 
3 6 9 8 4 5 7 2 1 
2 8 7 1 6 9 5 3 4 
5 2 1 9 7 4 3 6 8 
4 3 8 5 2 6 9 1 7 
7 9 6 3 1 8 4 5 2295种解法
解法1:
8 1 2 7 5 3 6 4 9 
9 4 3 6 8 2 1 7 5 
6 7 5 4 9 1 2 8 3 
1 5 4 2 3 7 8 9 6 
3 6 9 8 4 5 7 2 1 
2 8 7 1 6 9 5 3 4 
5 2 1 9 7 4 3 6 8 
4 3 8 5 2 6 9 1 7 
7 9 6 3 1 8 4 5 2 
解法2:
8 1 2 7 5 3 6 4 9 
9 4 3 6 8 2 1 7 5 
6 7 5 4 9 1 2 8 3 
1 5 4 2 3 7 8 9 6 
3 6 9 8 4 5 7 2 1 
2 8 7 1 6 9 5 3 4 
5 2 1 9 7 4 3 6 8 
4 3 8 5 2 6 9 1 7 
7 9 6 3 1 8 4 5 2 
解法3:
...

总结

通过使用回溯算法,我们可以有效地求解数独问题。虽然回溯算法在最坏情况下的时间复杂度较高,但对于标准9x9的数独问题,它通常能够在合理的时间内找到解决方案。希望本文对你理解数独求解算法有所帮助,并激发你进一步探索算法的兴趣。

http://www.lryc.cn/news/580753.html

相关文章:

  • 南通高端网站建设/大数据营销案例
  • 网站首选域301如何做/疫情最新消息今天封城了
  • 建设企业网站个人网银/网站营销方案
  • 自己做网站视频/免费网站seo诊断
  • 私人定制网站建设/百度seo推广首选帝搜软件
  • 合肥网站制作专业/广州网站设计建设
  • 网站排名优化课程/营销网点机构号
  • wordpress 资源站点/seo如何优化网站步骤
  • 成都市建设二维码检测网站/seo关键词优化工具
  • 做推文的网站知乎/前端开发培训机构推荐
  • 广德县建设协会网站/自己建立网站步骤
  • 静态单页网站wordpress/app推广代理去哪里找
  • 网站建设公司服务公司/海外广告优化师
  • 做网站的如何开发业务/模板免费下载网站
  • c 做网站用什么框架/北京出大大事了
  • 中企视窗做网站怎么样/友联互换
  • 长春市网站制作/google年度关键词
  • 企业网站的主要功能板块/百度一下官网首页网址
  • 山东省住房和城乡建设厅电话/seo对各类网站的作用
  • 做搜狗手机网站快速排/策划公司
  • 哪个网站可以免费做音乐相册/怎么设计一个网页
  • 专业站/电商网站平台搭建
  • 大学生创意电子产品设计/北京seo加盟
  • b站黄页推广网站/seo专员岗位职责
  • 网站首页英文/torrentkitty搜索引擎
  • 云课堂哪个网站做的好/广州企业网站seo
  • wordpress 引入css/重庆电子商务网站seo
  • 聊天交友网站建设费用/7个湖北seo网站推广策略
  • 如何快速做网站/uc搜索引擎入口
  • 品牌营销的概念/青岛seo经理