1. 程式人生 > >回溯法尋找數獨(java)

回溯法尋找數獨(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骰子1311514

智力遊戲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

hdu1426Sudoku Killer解題報告---深搜 & 回溯 & 輸入格式控制

                                          &

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 □□□ 它表示:兩個兩位數相乘等於一個兩位數乘以一個 三位數。 如果沒有限定條件,這樣的例子很多