java使用回溯法求解数独示例
发布时间:2023-08-17 14:39:10
import java.util.Calendar;
import java.util.Date;
public class Matrix {
private int matrix[][];
private long timeAfter=0;
private long timeBefore =0;
public Matrix(int m[][]) {
matrix = new int[9][9];
for (int i=0; i<9 ; i++)
for(int j= 0; j<9; j++)
matrix[i][j]=m[i][j];
this.timeBefore = Calendar.getInstance().getTimeInMillis();
}
public void backTrack(int i, int j)
{
//回收系统内存资源
System.gc();
if( i==8 && j>=9 )
{
this.timeAfter = Calendar.getInstance().getTimeInMillis();
//成功输出矩阵
this.showMatrix();
return;
}
if(j == 9) {j = 0; i++;}
if(matrix[i][j] == 0)
{
//数字为零
for(int k=1; k<=9; k++)
{
if(bound(i,j,k))
{
matrix[i][j] = k ;
//符合条件,查找下一个方格
backTrack(i,j+1);
matrix[i][j] = 0 ;
}
}
}else
{
//数字不为零,直接查找下一个
backTrack(i, j+1);
}
}
/**
* 判断要填入的数字和同行同列以及同一九宫格内数字是否重复
*/
private boolean bound(int i, int j, int k) {
int m = i/3;
int n = j/3;
for(int p = 0; p<9; p++)
{
if(k == matrix[i][p])
{
return false;
}
if(k == matrix[p][j])
{
return false;
}
if(k == matrix[3*m+p/3][3*n+p%3])
{
return false;
}
}
return true;
}
/**
* 打印解题时间
* @return
*/
public long printTime()
{
return this.timeAfter-this.timeBefore;
}
/**
* 打印矩阵
*/
public void showMatrix()
{
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
System.out.print(matrix[i][j]+" ");
}
System.out.println ();
}
System.out.println ();
System.out.println("解题时间: "+printTime()+"毫秒");
System.out.println ();
}
public static void main(String[] args) {
int matrix[][] = {
{3,0,6,0,5,7,0,0,0},
{7,9,0,0,2,4,0,0,0},
{0,5,0,6,0,0,9,7,4},
{8,0,1,0,0,9,0,0,0},
{0,2,0,3,0,8,0,0,7},
{4,0,0,0,6,0,5,0,0},
{0,0,4,0,3,6,0,5,0},
{2,0,3,7,0,5,0,0,1},
{0,0,7,4,1,0,6,0,0}};
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 ma2[][]={
{0,0,0,0,8,4,0,0,0},//8
{0,0,0,2,0,3,0,8,0},
{8,3,0,9,0,0,0,5,0},
{0,5,3,0,9,0,7,0,0},
{0,0,0,6,3,7,0,4,5},//7
{0,7,0,5,0,0,0,0,0},
{0,0,6,8,0,0,0,0,0},
{3,0,0,0,2,9,0,0,0},
{2,0,9,3,0,0,0,0,1}};//3
// 号称世界上最难数独
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, 6, 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 }};
Matrix m = new Matrix(sudoku);
m.backTrack(0, 0);
}
}


猜你喜欢
- C#类如下:using System;using System.Collections.Generic;using System.Text;
- 一、为什么需要GC应用程序对资源操作,通常简单分为以下几个步骤:1、为对应的资源分配内存2、初始化内存3、使用资源4、清理资源5、释放内存应
- 本文实例讲述了Android列表控件Spinner简单用法。分享给大家供大家参考,具体如下:Android的Spinner控件用来显示列表项
- 从什么是IOC开始?Spring——春天,Java编程世界的春天是由一位音乐家—
- 问题使用Runtime调用python脚本一直没有结果,经排查是因为 cv2 的 import 问题java代码:python代码:在导入c
- Kotlin 面向对象这几天一直在准备考试,实在没有时间,已经过去了这么久,终于要到面向对象了!先看看Kotlin中的类长什么样吧.可以看到
- 本文实例为大家分享了java实现微信红包的具体代码,供大家参考,具体内容如下要求基于BigDecimal类实现微信红包算法的功能,比如设置红
- public static string DateDiff(DateTime DateTime1, DateTime DateT
- 本文实例为大家分享了Android实现多条目加载展示的具体代码,供大家参考,具体内容如下展示效果依赖testCompile 'jun
- 本文实例分析了java中成员变量与局部变量区别。分享给大家供大家参考。具体分析如下:成员变量:在这个类里定义的私有变量,属于这个类。创建以及
- 加密代码using System;using System.IO;using System.Security.Cryptography;pu
- 一、什么叫做匿名类?匿名类就是没有名字的类。匿名类不能被引用,只能再创建的时候用new语句来声明。二、匿名类的优势以及应用场景;1、匿名类型
- 比较适合新手。逻辑上仍然有点问题。可以用于学习java文件操作下载地址:http://yun.baidu.com/share/link?sh
- //计算耗时任务所需的秒数public int GetTimeSpan(DateTime dtStart, DateTime dtEnd){
- 本文实例总结了Android文件读写操作。分享给大家供大家参考,具体如下:在Android中的文件放在不同位置,它们的读取方式也有一些不同。
- springboot使用mybatis一对多的关联查询由于刚开始写java不久,对sql语句的熟悉度还是不够熟练,虽然现在使用的mybati
- 本文实例讲述了C#基于基姆拉尔森算法计算指定日期是星期几的方法。分享给大家供大家参考。具体分析如下:基姆拉尔森计算公式 W= (d+2*m+
- 账户类Account:Id:账户号码PassWord:账户密码Name:真实姓名PersonId:身份证号码Email:客户的电子邮箱Bal
- SpringBoot项目上传图片一般是上传至远程服务器存储,开发过程中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传
- 嵌套查询使用Fluent Mybatis, 不用手写一行xml文件或者Mapper文件,在dao类中即可使用java api构造中比较复杂的