日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 解决世界最难数独

發(fā)布時間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 解决世界最难数独 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用java算法解決世界最難數(shù)獨,我這花費的時間是60ms,雖然我發(fā)現(xiàn)有些人可以做到40ms以內(nèi),可能是用c++寫的,我這使用java給后來者一個借鑒吧,本人也不是寫的很好,望各位批評指正。 總體思路就是先填一個數(shù),然后再填一個數(shù),每次都判斷是否和數(shù)獨規(guī)定沖突,沖突就回滾,然后繼續(xù)算…… 下面貼代碼(一共兩個類,不過多解釋了) package com.cy.sudoku;public class Main {public static void main(String[] args) {// TODO Auto-generated method stubint[][] sudokuform = new int[][]{{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,0,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}};long startTime = System.currentTimeMillis();new SudoKuUtils(sudokuform).sudoKu();System.out.println( "總耗時:" + (System.currentTimeMillis() - startTime) + "ms");} }
package com.cy.sudoku;import java.util.ArrayList; import java.util.List;public class SudoKuUtils {// 待解決的數(shù)獨表private int[][] sudokuform;// 我需要填寫的答案的下標(biāo)private List answerI, answerJ;private int[][] answer;// 我需要填寫的答案數(shù)private int answerNum;public SudoKuUtils(int[][] sudokuform) {answerI = new ArrayList<>();answerJ = new ArrayList<>();this.sudokuform = sudokuform;getAnswerIndex();answerNum = answerI.size();}/*** 獲得需要填寫答案的位置的下標(biāo),存入兩個list*/public void getAnswerIndex() {answerI.clear();answerJ.clear();int[] answerIndex = new int[3];for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (sudokuform[i][j] == 0) {answerI.add(i);answerJ.add(j);}}}}/*** 主要入口*/public void sudoKu() {for (int i = 0; i < answerI.size(); i++) {for (int a = 1; a < 10; a++) {if (isOk((int) answerI.get(i), (int) answerJ.get(i), a)&& a > sudokuform[(int) answerI.get(i)][(int) answerJ.get(i)]) {sudokuform[(int) answerI.get(i)][(int) answerJ.get(i)] = a;// System.out.println((int) answerI.get(i) + " " + (int)// answerJ.get(i) + " " + a);break;} else if (a == 9) {if (i == 0) {System.out.println("無解");return;}sudokuform[(int) answerI.get(i)][(int) answerJ.get(i)] = 0;if (i < 1) {i = i - 1;} else {i = i - 2;}break;}}}print(sudokuform);}/*** 傳入i( 行)j(列)以及填入的值,判斷是否符合要求*/public boolean isOk(int i, int j, int answer) {for (int n = 0; n < 9; n++) {if (sudokuform[i][n] == answer) {return false;}}for (int n = 0; n < 9; n++) {if (sudokuform[n][j] == answer) {return false;}}if (i <= 2) {if (j <= 2) {for (int n = 0; n < 3; n++) {for (int m = 0; m < 3; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else if (j <= 5) {for (int n = 0; n < 3; n++) {for (int m = 3; m < 6; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else {for (int n = 0; n < 3; n++) {for (int m = 6; m < 9; m++) {if (sudokuform[n][m] == answer) {return false;}}}}} else if (i <= 5) {if (j <= 2) {for (int n = 3; n < 6; n++) {for (int m = 0; m < 3; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else if (j <= 5) {for (int n = 3; n < 6; n++) {for (int m = 3; m < 6; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else {for (int n = 3; n < 6; n++) {for (int m = 6; m < 9; m++) {if (sudokuform[n][m] == answer) {return false;}}}}} else {if (j <= 2) {for (int n = 6; n < 9; n++) {for (int m = 0; m < 3; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else if (j <= 5) {for (int n = 6; n < 9; n++) {for (int m = 3; m < 6; m++) {if (sudokuform[n][m] == answer) {return false;}}}} else {for (int n = 6; n < 9; n++) {for (int m = 6; m < 9; m++) {if (sudokuform[n][m] == answer) {return false;}}}}}return true;}/*** 輸出二維數(shù)組* * @param a*/public void print(int[][] a) {for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {System.out.print(" " + a[i][j] + " ");if (j == 8) {System.out.println();}}}}/*** 輸出一維數(shù)組* * @param a*/public void print(int[] a) {for (int i = 0; i < 9; i++) {System.out.print(" " + a[i] + " ");}} }

總結(jié)

以上是生活随笔為你收集整理的java 解决世界最难数独的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。