java使用回溯法求解數(shù)獨(dú)示例
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)
{
//回收系統(tǒng)內(nèi)存資源
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)
{
//數(shù)字為零
for(int k=1; k<=9; k++)
{
if(bound(i,j,k))
{
matrix[i][j] = k ;
//符合條件,查找下一個(gè)方格
backTrack(i,j+1);
matrix[i][j] = 0 ;
}
}
}else
{
//數(shù)字不為零,直接查找下一個(gè)
backTrack(i, j+1);
}
}
/**
* 判斷要填入的數(shù)字和同行同列以及同一九宮格內(nèi)數(shù)字是否重復(fù)
*/
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;
}
/**
* 打印解題時(shí)間
* @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("解題時(shí)間: "+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
// 號(hào)稱世界上最難數(shù)獨(dú)
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);
}
}
相關(guān)文章
Java 中 synchronized的用法詳解(四種用法)
Java語言的關(guān)鍵字,當(dāng)它用來修飾一個(gè)方法或者一個(gè)代碼塊的時(shí)候,能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼。本文給大家介紹java中 synchronized的用法,對(duì)本文感興趣的朋友一起看看吧2015-11-11Spring實(shí)戰(zhàn)之XML與JavaConfig的混合配置詳解
大家都知道Spring的顯示配置方式有兩種,一種是基于XML配置,一種是基于JavaConfig的方式配置。那么下這篇文章主要給大家分別介紹如何在JavaConfig中引用XML配置的bean以及如何在XML配置中引用JavaConfig,需要的朋友可以參考下。2017-07-07Hibernate中l(wèi)oad方法與get方法的區(qū)別
Hibernate中有兩個(gè)極為相似的方法get()與load(),他們都可以通過指定的實(shí)體類與ID從數(shù)據(jù)庫中讀取數(shù)據(jù),并返回對(duì)應(yīng)的實(shí)例,但Hibernate不會(huì)搞兩個(gè)完全一樣的方法的2016-01-01Spring security如何重寫Filter實(shí)現(xiàn)json登錄
這篇文章主要介紹了Spring security 如何重寫Filter實(shí)現(xiàn)json登錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解
這篇文章主要介紹了System.currentTimeMillis()計(jì)算方式與時(shí)間的單位轉(zhuǎn)換詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05基于Eclipse 的JSP/Servlet的開發(fā)環(huán)境的搭建(圖文)
本文將會(huì)詳細(xì)地展示如何搭建JSP的開發(fā)環(huán)境。本次教程使用的是最新版的Eclipse 2018-09編輯器和最新版的Apache Tomcat v9.0,步驟詳細(xì),內(nèi)容詳盡,適合零基礎(chǔ)學(xué)者作為學(xué)習(xí)參考2018-12-12Java負(fù)載均衡服務(wù)器實(shí)現(xiàn)上傳文件同步
這篇文章主要介紹了Java負(fù)載均衡服務(wù)器實(shí)現(xiàn)上傳文件同步,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)re
這篇文章主要介紹了springboot2.0和springcloud Finchley版項(xiàng)目搭建(包含eureka,gateWay,F(xiàn)reign,Hystrix),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-05-05