回溯法尋找數獨(java)
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);
}
}
相關推薦
回溯法尋找數獨(java)
import java.util.Calendar; import java.util.Date; public class Matrix { private int matrix[][]; private long timeAfter=0; private long timeBefore
用程式碼證明自己閒的蛋疼(三)——回溯法做數獨
數獨大家應該都玩過,1~9數字,滿足每一行、每一列、每一個粗線宮(3*3)內的數字均含1-9,不重複。 起始會有一些給定的值,然後我們去填剩餘的數,一個合理的數獨最終解一定是唯一的。 九日哥也很喜歡玩數獨,喜歡到最後都懶得算了,直接寫個程式搜出答案。。。 其實想一想,
排序算法之高速排序(Java)
大於 一個數 大小 main div 移動 swap 交換 system //高速排序 public class Quick_Sort { // 排序的主要算法 private int Partition(int[] data, int start, int en
遞推遞歸組合數,漢諾塔,回文數問題(java)
char n-1 判斷 resource int swa one ise tex 遞推遞歸組合數: 1 思路:用函數求得n!,調用函數計算結果流程圖 2 .1流程圖 3 .1源代碼: import java.util.Scanner; public class
數獨(一)
基礎 分析 align 需要 code odin rem 設計 開發 PSP2.1 Personal Software Process Stages 預估耗時 ·Planning ·計劃 30分 ·Estimate ·估計這個任務需要多少時間 3周
2018.11.07【校內模擬】數獨(模擬)
傳送門 解析: 直接模擬,隨手寫了一個壓位的二進位制優化數獨,並沒有什麼用,好處只有搜尋才能體現出來吧。。。 程式碼: #include<bits/stdc++.h> using namespace std; #define ll long lon
C++小遊戲(原創)——數獨(sudoku)
#include <iostream> #include <cstring> #include <time.h> #include <cstdlib> #include<windows.h> using
hdu - 1426 數獨(dfs)
搜尋樹的概念 將搜尋過程中每一步的狀態變成樹的一個接點; 根節點為搜尋樹的初始狀態; 搜尋便是不斷擴充套件這棵樹,直至找到目標狀態位置; 搜尋演算法的優化和改正便在於如何拓展搜尋樹的節點; 解題第一步:如何將狀態轉化為樹中的結點,並構造搜尋樹; dfs:對於一個合法的狀態A,對於其所有的子狀
LeetCode 2.兩數相加(Java)
題目描述: 給出兩個 非空 的連結串列用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的連結串列來表示它們的和。 您可
LeetCode 1.兩數之和(Java)
題目描述: 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。 你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個陣列中同樣的元素。 示例: 給定 n
回溯法解決八皇后(c++)
八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n1×n1,而皇后個數也變成n2。而且僅當
OpenCV玩九宮格數獨(二):knn數字識別
前言 首先需要說明,這裡所說的數字識別不是手寫數字識別! 但凡對機器學習有所瞭解的人,相信看到數字識別的第一反應就是MNIST。MNIST是可以進行數字識別,但是那是手寫數字。我們現在要做的是要識別從九宮格圖片中提取出來的印刷體的數字。手寫數字集訓練出來的模
NYOJ 722 數獨(dfs)
數獨 時間限制:1000 ms | 記憶體限制:65535 KB 難度:4 描述 數獨是一種運用紙、筆進行演算的邏輯遊戲。玩家需要根據9×9盤面上的已知數字,推理出所
49骰子數獨(13)115(14)
智力遊戲49骰子數獨(13)規則和21骰子數獨(12)差不多,不過不是123123...了,是12341234...首先,圈出來的這2個4周圍只有1個1,所以這2個4必定有一個是終點其次,除了這2個4之
OpenCV 玩九宮格數獨(二):knn 數字識別
前言 首先需要說明,這裡所說的數字識別不是手寫數字識別! 但凡對機器學習有所瞭解的人,相信看到數字識別的第一反應就是MNIST。MNIST是可以進行數字識別,但是那是手寫數字。我們現在要做的是要識別從九宮格圖片中提取出來的印刷體的數字。手寫數字集訓練出來的模型用來識別
選擇法數組排序參考(Java)
排序 pri str com system div ring ack emp package com.swift; public class Xuanze { public static void main(String[] args) { i
LeetCode題目--有效的數獨(python/Java實現)
題目 判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以
算法筆記_219:泊松分酒(Java)
ava import 輸入 block -s 數學 步驟 ner 命名 目錄 1 問題描述 2 解決方案 1 問題描述 泊松是法國數學家、物理學家和力學家。他一生致力科學事業,成果頗多。有許多著名的公式定理以他的名字命名,比如概率論中著名的泊松分布。 有一次閑
算法筆記_220:猜算式(Java)
情況 name 描述 -s out 解決 string check 問題 目錄 1 問題描述 2 解決方案 1 問題描述 看下面的算式: □□ x □□ = □□ x □□□ 它表示:兩個兩位數相乘等於一個兩位數乘以一個 三位數。 如果沒有限定條件,這樣的例子很多