算法之6-回溯法解数独问题
来源:互联网 发布:福建广电网络电视客服 编辑:程序博客网 时间:2024/05/17 03:05
刚开始学习的时候,总是不知道对数组进行回溯的时候,怎么保证找到的是下一个空值, 所以写好一半的代码就放在一边,一个星期之后回过头再看回溯法解数独的时候,突然醒悟过来:
原来在构造数组的时候,以0值代替空值,当从1-9的某一个数填入该处的时候,该处就不是0值,回溯重新调用方法的时候,找到的0值就是下一处的0值了.
注意点:
(1).sudoku方法的返回值是布尔值,这样子"&&"两边才都是布尔值
(2)九宫格的获得iGrid和jGrid都是用i,j对3整除再乘以3(以前错误认识:九宫格是以i,j为中心的九宫)
(3)数独的表示,空值用0表示
今天还有其它事,把待解决的记录下来,以便以后参考:
待解决问题:
(1)输出多个相同的数独解
代码如下:
public class Sudodu {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubint[][] chess = { {0,4,2,0,6,3,0,0,9},{6,0,0,0,1,0,0,0,5},{3,0,0,0,2,0,4,8,0},{1,0,0,5,0,2,6,0,8},{4,0,0,0,0,7,0,0,1},{9,0,5,6,0,0,0,0,7},{0,3,6,0,5,0,0,0,2},{2,0,0,0,7,0,0,0,4},{7,0,0,2,9,0,8,5,0}} ;sudoku(chess);}static boolean sudoku(int[][] chess) {// TODO Auto-generated method stubfor(int i=0;i<9;i++){for(int j=0;j<9;j++){ //过滤掉不为0的情况 if(chess[i][j] != 0) continue;for(int d=1;d<=9;d++){chess[i][j]=d;if(isValid(chess,i,j) && sudoku(chess) ){shuchushudu(chess);return true;}chess[i][j]=0;}return false;}}return true;}private static void shuchushudu(int[][] chess) {// TODO Auto-generated method stubfor(int i=0;i<9;i++){for(int j=0;j<9;j++){System.out.print(chess[i][j]+" ");}System.out.println(" ");}System.out.println("--------------");}private static boolean isValid(int[][] chess, int i, int j) {// TODO Auto-generated method stubboolean flag=true;int data=chess[i][j];for(int k=0;k<9;k++){//i行相等if( (k!=j) && (chess[i][k]==data)){ return false;}//j列相等if( (k!=i) && (chess[k][j]==data)){return false;}}//九宫相等int iGrid=(i/3)*3;int jGrid=(j/3)*3;for(int k2=iGrid;k2<iGrid+3;k2++){for(int k3=jGrid;k3<jGrid+3;k3++){if((i==k2) && (j==k3)){continue;}if(chess[k2][k3]==data){return false;}}}return true;}}
5 4 2 8 6 3 7 1 9
6 8 7 4 1 9 2 3 5
3 9 1 7 2 5 4 8 6
1 7 3 5 4 2 6 9 8
4 6 8 9 3 7 5 2 1
9 2 5 6 8 1 3 4 7
8 3 6 1 5 4 9 7 2
2 5 9 3 7 8 1 6 4
7 1 4 2 9 6 8 5 3
0 0
- 算法之6-回溯法解数独问题
- 回溯法解数独问题
- Java回溯算法解数独问题
- 回溯法解数独
- 回溯法解数独
- 回溯法解数独
- 解数独-回溯法
- [人工智能]回溯算法解数独
- 回溯算法解数独问题(java版)
- 回溯算法解数独问题(java版)
- 回溯法解数独题
- 回溯法解数独游戏
- 【算法分析】回溯法解数独(九宫格)算法
- 回溯法----- 解数独游戏(1)
- 回溯法------ 解数独游戏(2)
- 回溯法简单应用--解数独
- 递归暴力破解法解数独问题
- DFS解数独问题
- C++类型转换
- JDBC连接MySql数据库
- 程序Unite4
- LeetCode 026 Remove Duplicates from Sorted Array
- java线程——什么是线程?
- 算法之6-回溯法解数独问题
- 使用boost的库链接问题generic_category()
- Jenkins权限配置失误后导致登录失败的解决办法
- C++类型转换
- HDU3240题解
- RTL的实现
- EF--ORM
- SharedPreferences保存数据
- EXT4磁盘组织 - EXT4文件系统分析 1