求解数独回溯算法

实现的java代码如下(该算法只是将结果打印输出,并没有对原数组实现更改):

    //判断a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判断是否跟同行冲突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判断是否跟同列冲突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宫格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判断值是否跟所在九宫格冲突for(int i2=3*i1;i2<3*(i1+1);i2++){           for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;}//打印数独public void printMatrix(int[][] a){for(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(a[i][j]+" ");}System.out.println();}}//回溯法求解数独public void shuDu(int[][] a, int i, int j){if(i==8&&j>=9){printMatrix(a);return;}if(j==9){j=0;i++;}if(a[i][j]==0){for(int k=1;k<=9;k++){if(isValid(a,i,j,k)){a[i][j] = k;//向下继续找shuDu(a,i,j+1);//如果没有找到全部答案将a[i][j]的值恢复a[i][j] = 0;}}}else{shuDu(a,i,j+1);}}

算法调用示例如下:

public static void main(String[] args) {Solution solu = new Solution();int ma1[][]={{0,3,0,0,0,5,0,6,0},{0,1,0,0,0,3,0,8,0},{0,4,0,0,0,0,0,0,7},{0,0,7,0,2,4,0,0,0},{5,0,0,0,9,0,0,0,0},{0,8,0,3,0,0,5,0,0},{0,0,0,8,0,0,0,0,0},{0,0,9,0,0,0,0,7,3},{0,5,0,9,0,0,0,0,2}};int[][] sudoku = { {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}};solu.shuDu(sudoku, 0, 0);
}            

 不进行打印,实现更改数组的改进算法(数组为字符数组,可根据需要进行更改):

public class Solution {//判断a[i][j]取值val是否有效public boolean isValid(char[][] a, int i, int j, char val){//判断是否跟同行冲突for(int j1=0;j1<9;j1++){if(a[i][j1]==val)return false;}//判断是否跟同列冲突for(int i1=0;i1<9;i1++){if(a[i1][j]==val)return false;}//找出a[i][j]所在的九宫格int i1 = 0, j1 = 0;boolean flag = true;for(i1=0;i1<3&&flag;i1++){if(!(i>=i1*3&&i<3*(i1+1)))continue;for(j1=0;j1<3;j1++){if(j>=j1*3&&j<3*(j1+1)){flag = false;break;}}}i1--;//判断值是否跟所在九宫格冲突for(int i2=3*i1;i2<3*(i1+1);i2++){           for(int j2=3*j1;j2<3*(j1+1);j2++){if(a[i2][j2]==val)return false;}}return true;} //回溯法求解数独public boolean shuDu(char[][] a, int i, int j){if(i==8&&j>=9){return true;}if(j==9){j=0;i++;}if(a[i][j]=='.'){char ch = '1';for(int k=0;k<9;k++){if(isValid(a,i,j,(char)(ch+k))){a[i][j] = (char) (ch+k);//向下继续找if(shuDu(a,i,j+1))return true;//如果没有找到全部答案将a[i][j]的值恢复a[i][j] = '.';}}}else{if(shuDu(a,i,j+1))return true;}return false;}public void solveSudoku(char[][] board) {shuDu(board, 0, 0);}
}

 

转载于:https://www.cnblogs.com/gaopeng527/p/4873447.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python语言属于哪一种语言_Python与Java:你应该学习哪种语言,他们有什么区别?...

在企业招聘中&#xff0c; Python和Java经常是需求最大的编程语言。这两种编程功能强大&#xff0c;灵活且面向对象的语言&#xff0c;通常在组织中和各种其他设置中使用。这可能会导致我们提出一个不可避免的问题&#xff1a;哪个更好&#xff1f; 这是一个复杂的问题&#xf…

关于手机端CSS Sprite图标定位的一些领悟

今天在某个群里面闲逛&#xff0c;看见一个童鞋分享了一个携程的移动端的页面。地址这里我也分享下吧&#xff1a;http://m.ctrip.com/html5/在手机端我都很少用雪碧图合并定位图标&#xff0c;用的比较多就是用字体图标来代替&#xff0c;有些图标不多的时候就自己单个的切出来…

将Java向前推进? 一个定义。 一年回顾。

这篇文章是许多其他“年终”博客文章和评论之一。 但这并不是这样。 我正在尝试总结我在2011年所学到的有关Oracle和Java的知识&#xff0c;还试图解释“将Java向前推进”对我的意义以及我认为应该更好或更简单地改变的东西。 感谢您全年关注我的博客&#xff0c;也感谢您在Twi…

c语言程序源代码_程序的编译、链接和执行

同学们总是抱怨每次见到一道面试题都很难把它转化为程序源代码。然而不幸的是&#xff0c;即使是程序源代码对于计算机来说也还是太高级了。要想让计算机执行一段程序&#xff0c;我们必须把它翻译成最底层的机器指令才行。这其中要经历很多步骤。幸运的是有很多现成的工具可以…

Ubuntu下tftp服务器的搭建

参考博客&#xff1a;http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安装$ apt-get install tftp-hpa tftpd-hpa2. 建立目录$ mkdir /tftpboot # 这是建立tftp传输目录。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好输入内容以便区分3. 配…

【程序员眼中的统计学(1)】信息图形化:第一印象

信息图形化&#xff1a;第一印象 作者 白宁超 2015年10月13日23:23:13 摘要&#xff1a;程序员眼中的统计学系列是作者和团队共同学习笔记的整理。首先提到统计学&#xff0c;很多人认为是经济学或者数学的专利&#xff0c;与计算机并没有交集。诚然在传统学科中&#xff0c;其…

JBoss AS 7.0.2“ Arc”发布–使用绑定选项

有关JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已经发布&#xff01; 自AS 7.0.1发布以来已经过去了一个月。 在这短时间内&#xff0c;已修复了许多错误&#xff0c;并实现了更多功能和改进。 所有这些错误修复和功能已包含在此7.0.2版本中。 此新版本主要包…

C语言开发笔记(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代码为什么会运行错误&#xff0c;异常退出&#xff1f; 这段代码是新手常见错误之一。 定义…

不属于python标准库的是_python标准库和扩展库

Tkinter ———— Python 默认的图形界面接口。 Tkinter 是一个和 Tk 接口的模块&#xff0c; Tkinter 库提供 了对 Tk API 的接口&#xff0c;它属于 Tcl/Tk 的 GUI 工具组。 Tcl/Tk 是由 John Ousterhout 发展的书写和 图形设备。 Tcl( 工具命令语言 ) 是个宏语言&#xff0c…

Android N 新特性 + APP开发注意事项

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;这是Android N里对开发者影响比较大的特性&#xff0c;也是大家疑问比较多的地方。站在开发者的角度其实不必太担心这个特性会导致我们需要修改很多代码来适配系统。Google的工程师们也不希望这个特性导致很多应用出现问题&…

C语言开发笔记(六)实参和形参

举例说明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }结果为 在函数调用时&#xff0c;a的值传给x&#xff0c;b的值传给y。执行完…

Spring Singleton,请求,会话Bean和线程安全

由众多有用框架组成的Spring框架生态系统已成为许多Java EE应用程序的基础。 但是在所有Spring产品的核心中&#xff0c;我们仍然拥有Spring DI / IOC框架&#xff0c;该框架将Spring推向了新的高度。 随着越来越多的人将Spring MVC或JSF-Spring集成用于他们的应用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.浏览器前缀&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3过渡动画&#xff1a;transitio…

面试之ajax原理(转载)

总结1 总结2 AJAX全称为“Asynchronous JavaScript and XML”&#xff08;异步JavaScript和XML&#xff09;&#xff0c;是一种创建交互式网页应用的网页开发技术&#xff0c; 是几种原有技术的结合体。它由下列技术组合而成。 1.使用CSS和XHTML来表示。 2. 使用DOM模型来交互和…

优化方案电子版_关于小区分支道路整修设计方案的讨论稿(No.2020121)

各位业主&#xff0c;大家好&#xff01; 关于绿洲比华利花园主干道翻新和次干道整修前期勘查和设计方案&#xff0c;经业委会及小区专家小组、设计单位申都设计公司工程设计人员结合本小区的实际情况进行了深入讨论&#xff0c;优化设计&#xff0c;形成如下三个独立方案&…

OSGI和Spring动态模块–简单的Hello World

在此姿势中&#xff0c;我们将采用使用OSGi进行的第一个实现&#xff0c;并使用Spring Dynamic Modules改进应用程序。 Spring动态模块&#xff08;Spring Dm&#xff09;使基于OSGi的应用程序的开发更加容易。 这样&#xff0c;服务的部署就容易得多。 您可以像其他任何Spring…

C语言代码规范(五)函数参数个数

一个函数的参数的数目过多&#xff08;尤其是超过8个&#xff09;显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度&#xff0c;参数越多&#xff0c;调用函数越慢。 参数的数目少&#xff0c;程序就显得精练、简洁&#xff0c;这有助于检查和发现程序中的错误。…

vijos P1740 聪明的质检员

题目链接:传送门 题目大意:给你n个物品&#xff0c;每件物品有重量 W 和价值 V&#xff0c;给m个区间&#xff0c;和一个标准值。(n,m最大200000) 要求找到一个值x&#xff0c;使得m个所有区间的权值和与标准值的差的绝对值最小。单个区间权值计算公式(数目num0&#xff0c;价值…

为什么有的开关电源需要加自举电容?

一、什么是自举电路&#xff1f; 1.1 自举的概念 首先&#xff0c;自举电路也叫升压电路&#xff0c;是利用自举升压二极管&#xff0c;自举升压电容等电子元件&#xff0c;使电容放电电压和电源电压叠加&#xff0c;从而使电压升高。有的电路升高的电压能达到数倍电源电压。…

VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏

右键工程-配置属性-清单工具-输入和输出&#xff0c;嵌入清单一项重新选择为否&#xff0c;如下图 修改后重新生成和运行&#xff0c;发现程序正常运行了。