目录

  • 号称世界最难的数独
  • 程序源码
  • 运行结果
  • 答案

号称世界最难的数独

程序源码

import java.util.ArrayList;
import java.util.HashSet;public class Main {private static final int MAX_GUESS_COUNT = 4096;private static int guessCount = 0;private static long startTime;private static void guessOneUnit(Sudoku sudoku) {if (++guessCount > MAX_GUESS_COUNT) {System.err.println("sudoku can't find the answer after " + guessCount + " times' guess so have to exit");sudoku.printEx(true);long endTime = System.currentTimeMillis();System.out.println("sudoku costs " + (endTime - startTime) + "ms to analyze this problem");System.exit(-1);}Sudoku.UnitToGuess unitToGuess = sudoku.fetchOneUnitToGuess();if (unitToGuess == null) {sudoku.printEx(true);System.err.println("sudoku enter a impossible situation and has to exit");return;}for (Integer e : unitToGuess.getOnes()) {Sudoku sudokuNew = sudoku.clone();sudokuNew.setOneUnit(unitToGuess.getRowIndex(), unitToGuess.getColIndex(), e);sudokuNew.printEx(true);if (sudokuNew.setUnitLoop()) {guessOneUnit(sudokuNew);}}}public static void solve(String input) {String[] lines = input.split("\\n");int[][] matrix = new int[Sudoku.LINE_UNIT_COUNT][Sudoku.LINE_UNIT_COUNT];for (int i = 0; i < Sudoku.LINE_UNIT_COUNT; ++i) {String[] units = lines[i].split(",");for (int j = 0; j < Sudoku.LINE_UNIT_COUNT; ++j) {matrix[i][j] = Integer.parseInt(units[j]);}}Sudoku sudoku = new Sudoku(matrix);sudoku.print("----------------original sudo matrix----------------");sudoku.initArray();sudoku.printEx(true);sudoku.setUnitLoop();guessOneUnit(sudoku);}public static class Sudoku implements Cloneable {public static final int LINE_MATRIX_UNIT_COUNT = 3;public static final int MATRIX_LINT_UNIT_COUNT = LINE_MATRIX_UNIT_COUNT;public static final int LINE_MATRIX_COUNT = LINE_MATRIX_UNIT_COUNT;public static final int MATRIX_UNIT_COUNT = LINE_MATRIX_UNIT_COUNT * LINE_MATRIX_UNIT_COUNT;public static final int LINE_UNIT_COUNT = MATRIX_UNIT_COUNT;public static final int PRINT_STEP_COUNT = 2000;private int[][] matrix;private ArrayList<Integer>[][] matrixEx;private HashSet<Integer>[] matrixRow;private HashSet<Integer>[] matrixCol;private HashSet<Integer>[][] matrixBlocks;private int finish;private int effective;private int empty;private static int index = 0;public Sudoku() {this(new int[LINE_UNIT_COUNT][LINE_UNIT_COUNT]);}public Sudoku(int[][] matrix) {this.finish = 0;this.effective = 0;this.empty = LINE_UNIT_COUNT * LINE_UNIT_COUNT;this.matrix = new int[LINE_UNIT_COUNT][LINE_UNIT_COUNT];this.matrixEx = new ArrayList[LINE_UNIT_COUNT][LINE_UNIT_COUNT];this.matrixRow = new HashSet[LINE_UNIT_COUNT];this.matrixCol = new HashSet[LINE_UNIT_COUNT];this.matrixBlocks = new HashSet[LINE_MATRIX_COUNT][LINE_MATRIX_COUNT];for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {this.matrix[i][j] = matrix[i][j];this.matrixEx[i][j] = new ArrayList<>();if (matrix[i][j] != 0) {--this.empty;++this.finish;}}}for (int k = 0; k < LINE_UNIT_COUNT; ++k) {matrixRow[k] = new HashSet<>();matrixCol[k] = new HashSet<>();}for (int i = 0; i < LINE_MATRIX_COUNT; ++i) {for (int j = 0; j < LINE_MATRIX_COUNT; ++j) {matrixBlocks[i][j] = new HashSet<>();}}}public Sudoku clone() {Sudoku sudoku = new Sudoku();sudoku.empty = empty;sudoku.effective = effective;sudoku.finish = finish;for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {sudoku.matrix[i][j] = matrix[i][j];for (Integer e : matrixEx[i][j]) {sudoku.matrixEx[i][j].add(e);}}}for (int k = 0; k < LINE_UNIT_COUNT; ++k) {for (Integer e : matrixRow[k]) {sudoku.matrixRow[k].add(e);}for (Integer e : matrixRow[k]) {sudoku.matrixRow[k].add(e);}}for (int i = 0; i < LINE_MATRIX_COUNT; ++i) {for (int j = 0; j < LINE_MATRIX_COUNT; ++j) {for (Integer e : matrixBlocks[i][j]) {sudoku.matrixBlocks[i][j].add(e);}}}return sudoku;}private ArrayList<Integer> getInitUnit() {ArrayList<Integer> unit = new ArrayList<>();for (int i = 1; i <= LINE_UNIT_COUNT; ++i) {unit.add(i);}return unit;}private ArrayList<Integer> getInitUnitWithValue(int i) {ArrayList<Integer> unit = new ArrayList<>();unit.add(i);return unit;}private void initArray() {for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrix[i][j] != 0) {matrixEx[i][j] = getInitUnitWithValue(matrix[i][j]);matrixRow[i].add(matrix[i][j]);matrixCol[j].add(matrix[i][j]);matrixBlocks[i / LINE_MATRIX_UNIT_COUNT][j / LINE_MATRIX_UNIT_COUNT].add(matrix[i][j]);}}}for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrix[i][j] == 0) {matrixEx[i][j] = getInitUnit();}}}}private void print(String title) {System.out.println(title);System.out.println("empty:" + empty + ",finish:" + finish + ",effective:" + effective);StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrix[i][j] != 0) {stringBuilder.append(" ").append(matrix[i][j]).append(" ");} else {stringBuilder.append("   ");}if (j != LINE_UNIT_COUNT - 1) {if (j % 3 == 2) {stringBuilder.append('║');} else {stringBuilder.append('│');}}}stringBuilder.append(System.lineSeparator());if (i != LINE_UNIT_COUNT - 1) {boolean isDouble = i % 3 == 2;printRowLine(isDouble, stringBuilder);}}stringBuilder.append(System.lineSeparator());System.out.println(stringBuilder);}private void printRowLine(boolean isDouble, StringBuilder stringBuilder) {String edge;char cross1;char cross2;if (isDouble) {edge = "═══";cross1 = '╪';cross2 = '╬';} else {edge = "───";cross1 = '┼';cross2 = '╫';}for (int i = 0; i < LINE_UNIT_COUNT; ++i) {stringBuilder.append(edge);if (i != LINE_UNIT_COUNT - 1) {if (i % LINE_MATRIX_UNIT_COUNT == 2) {stringBuilder.append(cross2);} else {stringBuilder.append(cross1);}}}stringBuilder.append(System.lineSeparator());}private void printEx(boolean force) {if (!force && ++index % PRINT_STEP_COUNT != 0) {return;}System.out.println("this is the " + index + "'th loop result");System.out.println("empty:" + empty + ",finish:" + finish + ",effective:" + effective);StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int l = 0; l < MATRIX_LINT_UNIT_COUNT; ++l) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {for (int k = 0; k < MATRIX_LINT_UNIT_COUNT; ++k) {int n = l * MATRIX_LINT_UNIT_COUNT + k + 1;if (matrixEx[i][j].contains(n)) {stringBuilder.append(" ").append(n).append(" ");} else {stringBuilder.append("   ");}}if (j != LINE_UNIT_COUNT - 1) {if (j % 3 == 2) {stringBuilder.append('║');} else {stringBuilder.append('│');}}}stringBuilder.append(System.lineSeparator());}if (i != LINE_UNIT_COUNT - 1) {boolean isDouble = i % 3 == 2;printRowLineEx(isDouble, stringBuilder);}}stringBuilder.append(System.lineSeparator());System.out.println(stringBuilder);}private void printRowLineEx(boolean isDouble, StringBuilder stringBuilder) {String edge;char cross1;char cross2;if (isDouble) {edge = "═══";cross1 = '╪';cross2 = '╬';} else {edge = "───";cross1 = '┼';cross2 = '╫';}for (int j = 0; j < LINE_UNIT_COUNT; ++j) {for (int k = 0; k < LINE_MATRIX_UNIT_COUNT; ++k) {stringBuilder.append(edge);}if (j != LINE_UNIT_COUNT - 1) {if (j % LINE_MATRIX_UNIT_COUNT == 2) {stringBuilder.append(cross2);} else {stringBuilder.append(cross1);}}}stringBuilder.append(System.lineSeparator());}private void finish() {print("sudoku has find one answer showed followed so will exit normally");long endTime = System.currentTimeMillis();System.out.println("sudoku costs " + (endTime - startTime) + "ms to analyze this problem");System.exit(0);}public static class UnitToGuess {private int rowIndex;private int colIndex;private ArrayList<Integer> ones = new ArrayList<>();public int getRowIndex() {return rowIndex;}public int getColIndex() {return colIndex;}public ArrayList<Integer> getOnes() {return ones;}public UnitToGuess(int rowIndex, int colIndex, ArrayList<Integer> ones) {this.rowIndex = rowIndex;this.colIndex = colIndex;for (Integer e : ones) {this.ones.add(e);}}}private boolean setOneUnit(int rowIndex, int colIndex, int element) {System.out.println("try to set unit[" + rowIndex + "," + colIndex + "]=" + element + " for next loop");return setUnit(false, rowIndex, colIndex, element);}public UnitToGuess fetchOneUnitToGuess() {int miniSize = MATRIX_UNIT_COUNT;int rowIndex = -1;int colIndex = -1;for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrixEx[i][j].size() > 1 && matrixEx[i][j].size() < miniSize) {rowIndex = i;colIndex = j;miniSize = matrixEx[i][j].size();}}}if (rowIndex != -1 && colIndex != -1) {return new UnitToGuess(rowIndex, colIndex, matrixEx[rowIndex][colIndex]);}return null;}public boolean setUnitLoop() {while (true) {int lastEffective = effective;if (!setUnitOfOneSize() || !setUnitInBlock() || !setUnitInLine(true) || !setUnitInLine(false)) {printEx(true);return false;}if (empty == 0) {finish();}if (effective == lastEffective) {System.out.println("this removeLoop can't remove any more");break;}}return true;}private ArrayList<Integer> getUnit(boolean revert, int rowIndex, int colIndex) {return revert ? matrixEx[colIndex][rowIndex] : matrixEx[rowIndex][colIndex];}private boolean checkRight() {boolean flag = true;for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrix[i][j] != 0) {for (int ii = i / LINE_MATRIX_UNIT_COUNT * LINE_MATRIX_UNIT_COUNT;ii < i / LINE_MATRIX_UNIT_COUNT * LINE_MATRIX_UNIT_COUNT + LINE_MATRIX_UNIT_COUNT; ++ii) {for (int jj = j / LINE_MATRIX_UNIT_COUNT * LINE_MATRIX_UNIT_COUNT;jj < j / LINE_MATRIX_UNIT_COUNT * LINE_MATRIX_UNIT_COUNT + LINE_MATRIX_UNIT_COUNT; ++jj) {if ((i != ii || j != jj) && matrix[i][j] == matrix[ii][jj]) {System.out.println("[" + i + ',' + j + "]=[" + ii + ',' + jj + "]=" + matrix[i][j]);flag = false;}}}for (int k = 0; k < LINE_UNIT_COUNT; ++k) {if (i != k && matrix[i][j] == matrix[k][j]) {System.out.println("[" + i + ',' + j + "]=[" + k + ',' + j + "]=" + matrix[i][j]);flag = false;}if (j != k && matrix[i][j] == matrix[i][k]) {System.out.println("[" + i + ',' + j + "]=[" + i + ',' + k + "]=" + matrix[i][j]);flag = false;}}}}}if (!flag) {System.out.println("sudoku's first guess is error and will try the other guess again");printEx(true);}return flag;}private boolean setUnit(boolean revert, int rowIndex, int colIndex, Integer e) {int i;int j;if (revert) {i = colIndex;j = rowIndex;} else {i = rowIndex;j = colIndex;}if (matrix[i][j] == 0 && matrixEx[i][j].contains(e)) {matrixEx[i][j].clear();matrixEx[i][j].add(e);matrix[i][j] = e;matrixRow[i].add(e);matrixCol[j].add(e);matrixBlocks[i / LINE_MATRIX_UNIT_COUNT][j / LINE_MATRIX_UNIT_COUNT].add(e);--empty;++finish;++effective;printEx(false);return checkRight();}return true;}private boolean setUnitInLine(boolean isRow) {boolean revert = !isRow;for (int j = 0; j < LINE_UNIT_COUNT; ++j) {int[] count = new int[LINE_UNIT_COUNT + 1];for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int e : getUnit(revert, i, j)) {count[e]++;}}ArrayList<Integer> ones = new ArrayList<>();for (int k = 1; k <= MATRIX_UNIT_COUNT; ++k) {if (count[k] == 1) {ones.add(k);}}for (int e : ones) {for (int i = 0; i < LINE_UNIT_COUNT; ++i) {boolean flag = setUnit(revert, i, j, e);if (!flag) {return false;}}}}return true;}private boolean setUnitInBlock() {for (int i = 0; i < LINE_MATRIX_COUNT; ++i) {for (int j = 0; j < LINE_MATRIX_COUNT; ++j) {int[] count = new int[MATRIX_UNIT_COUNT + 1];for (int ii = 0; ii < LINE_MATRIX_UNIT_COUNT; ++ii) {for (int jj = 0; jj < LINE_MATRIX_UNIT_COUNT; ++jj) {int indexI = i * LINE_MATRIX_UNIT_COUNT + ii;int indexJ = j * LINE_MATRIX_UNIT_COUNT + jj;for (int e : matrixEx[indexI][indexJ]) {count[e]++;}}}ArrayList<Integer> ones = new ArrayList<>();for (int k = 1; k <= MATRIX_UNIT_COUNT; ++k) {if (count[k] == 1) {ones.add(k);}}for (int e : ones) {for (int ii = 0; ii < LINE_MATRIX_UNIT_COUNT; ++ii) {for (int jj = 0; jj < LINE_MATRIX_UNIT_COUNT; ++jj) {int indexI = i * LINE_MATRIX_UNIT_COUNT + ii;int indexJ = j * LINE_MATRIX_UNIT_COUNT + jj;boolean flag = setUnit(false, indexI, indexJ, e);if (!flag) {return false;}}}}}}return true;}private boolean setUnitOfOneSize() {for (int i = 0; i < LINE_UNIT_COUNT; ++i) {for (int j = 0; j < LINE_UNIT_COUNT; ++j) {if (matrix[i][j] == 0) {if (matrixEx[i][j].removeAll(matrixRow[i]) || matrixEx[i][j].removeAll(matrixCol[j])|| matrixEx[i][j].removeAll(matrixBlocks[i / LINE_MATRIX_UNIT_COUNT][j / LINE_MATRIX_UNIT_COUNT])) {if (effective > 1000) {System.out.println("may error occur");}++effective;}if (matrixEx[i][j].size() == 0) {return false;} else if (matrixEx[i][j].size() == 1) {boolean flag = setUnit(false, i, j, matrixEx[i][j].get(0));if (!flag) {return false;}}}}}return true;}}public static void main(String[] args) {startTime = System.currentTimeMillis();String input =  "8,0,0,0,0,0,0,0,0\n" +"0,0,3,6,0,0,0,0,0\n" +"0,7,0,0,9,0,2,0,0\n" +"0,5,0,0,0,7,0,0,0\n" +"0,0,0,0,4,5,7,0,0\n" +"0,0,0,1,0,0,0,3,0\n" +"0,0,1,0,0,0,0,6,8\n" +"0,0,8,5,0,0,0,1,0\n" +"0,9,0,0,0,0,4,0,0";
//                "0,0,0,1,0,2,0,0,0\n" +
//                "0,0,8,0,6,0,7,0,5\n" +
//                "0,9,0,0,0,0,0,8,0\n" +
//                "4,0,0,0,1,0,0,0,0\n" +
//                "0,8,0,3,0,4,0,6,0\n" +
//                "3,0,0,0,2,0,8,0,0\n" +
//                "0,6,0,0,0,5,4,7,0\n" +
//                "0,0,5,0,7,0,6,0,9\n" +
//                "0,7,0,0,0,0,0,5,0";
//                        "0,0,0,0,0,2,0,5,0\n" +
//                        "0,7,8,0,0,0,3,0,0\n" +
//                        "0,0,0,0,0,4,0,0,0\n" +
//                        "5,0,0,0,0,0,0,0,0\n" +
//                        "0,0,0,0,0,0,1,0,0\n" +
//                        "0,0,0,0,3,0,7,0,8\n" +
//                        "2,0,0,0,0,0,0,4,0\n" +
//                        "0,0,0,0,0,5,0,9,0\n" +
//                        "0,1,0,0,7,0,0,0,0";
//                "0,0,0,0,0,0,7,0,0\n" +
//                "0,4,0,0,3,0,0,6,5\n" +
//                "0,0,1,0,0,8,0,0,0\n" +
//                "0,6,0,0,5,0,0,3,9\n" +
//                "4,0,0,6,0,0,0,0,0\n" +
//                "0,0,0,0,0,0,0,2,0\n" +
//                "8,0,0,0,0,3,0,9,7\n" +
//                "0,0,0,0,7,0,4,0,0\n" +
//                "0,9,0,0,0,0,2,0,0";solve(input);}
}

运行结果

... ...this is the 2068'th loop result
empty:21,finish:60,effective:309│ 1       │    2    ║         │         │       3 ║         │         │         │         │         ║         │    5    │         ║       6 │ 4       │         8    │         │         ║ 7       │         │         ║         │         │       9
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│         │       3 ║         │    2    │         ║ 1       │         │ 1       │ 4       │         ║       6 │         │         ║    5    │         │    5    9 │         │         ║         │         │    8    ║         │ 7       │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│         │         ║         │         │ 1       ║    2    │         │       3 6 │         │    5    ║ 4       │         │         ║         │         │         │ 7       │         ║         │       9 │         ║         │    8    │
═════════╪═════════╪═════════╬═════════╪═════════╪═════════╬═════════╪═════════╪═════════1       │         │         ║    2  3 │       3 │         ║         │    2    │         │    5    │ 4     6 ║         │       6 │         ║         │         │ 4     6 │         │       9 ║         │    8    │ 7       ║    8    │       9 │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│       3 │         ║    2  3 │         │         ║         │    2    │ 1       │       6 │       6 ║         │ 4       │    5    ║         │         │       6 │    8    │       9 ║    8    │         │         ║ 7       │       9 │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────2    │         │         ║ 1       │         │         ║         │       3 │         │       6 │ 4     6 ║         │       6 │         ║    5    │         │ 4  5  6 │    8    │ 7       ║         │    8    │       9 ║    8    │         │
═════════╪═════════╪═════════╬═════════╪═════════╪═════════╬═════════╪═════════╪═════════│    2    │ 1       ║         │         │         ║       3 │         │         5    │         │         ║         │         │ 4       ║         │       6 │         │         │         ║       9 │ 7       │         ║         │         │    8
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│       3 │         ║         │       3 │    2    ║         │ 1       │         4       │       6 │         ║    5    │       6 │         ║         │         │         │         │    8    ║         │         │         ║       9 │         │ 7
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────3 │         │         ║         │ 1       │         ║         │         │    2    │         │       6 ║         │         │       6 ║ 4       │    5    │         │       9 │ 7       ║    8    │         │         ║         │         │         try to set unit[1,4]=8 for next loop
this is the 2069'th loop result
empty:29,finish:52,effective:291│ 1       │    2    ║         │         │       3 ║         │         │         │         │         ║         │    5    │         ║       6 │ 4       │         8    │         │         ║ 7       │         │         ║         │         │       9
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│         │       3 ║         │         │    2    ║ 1       │         │ 1       │ 4       │         ║       6 │         │         ║    5    │         │    5    9 │         │         ║         │    8    │    8    ║         │ 7       │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│         │         ║         │         │ 1       ║    2    │         │       3 6 │         │    5    ║ 4       │         │         ║         │         │         │ 7       │         ║         │       9 │         ║         │    8    │
═════════╪═════════╪═════════╬═════════╪═════════╪═════════╬═════════╪═════════╪═════════1  2  3 │         │         ║    2  3 │    2  3 │         ║ 1       │    2    │ 1       │    5    │ 4     6 ║         │       6 │         ║         │         │ 4     6 │         │       9 ║    8    │    8    │ 7       ║    8    │       9 │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────1  2  3 │       3 │         ║    2  3 │         │         ║         │    2    │ 1       │       6 │       6 ║         │ 4       │    5    ║         │         │       6 │    8    │       9 ║    8    │         │         ║ 7       │       9 │
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────2    │         │         ║ 1       │    2    │         ║         │       3 │         │       6 │ 4     6 ║         │       6 │         ║    5    │         │ 4  5  6 7       │    8    │ 7       ║         │    8    │       9 ║    8    │         │
═════════╪═════════╪═════════╬═════════╪═════════╪═════════╬═════════╪═════════╪═════════│    2    │ 1       ║         │         │         ║       3 │         │         5    │         │         ║         │         │ 4       ║         │       6 │         │         │         ║       9 │ 7       │         ║         │         │    8
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────│       3 │         ║         │    2  3 │    2    ║         │ 1       │         4       │       6 │         ║    5    │       6 │       6 ║         │         │         │         │    8    ║         │         │         ║       9 │         │ 7
─────────┼─────────┼─────────╫─────────┼─────────┼─────────╫─────────┼─────────┼─────────3 │         │         ║       3 │ 1       │         ║         │         │    2    │         │       6 ║         │         │       6 ║ 4       │    5    │         7       │       9 │ 7       ║    8    │         │    8    ║         │         │         sudoku has find one answer showed followed so will exit normally
empty:0,finish:81,effective:3438 │ 1 │ 2 ║ 7 │ 5 │ 3 ║ 6 │ 4 │ 9
───┼───┼───╫───┼───┼───╫───┼───┼───9 │ 4 │ 3 ║ 6 │ 8 │ 2 ║ 1 │ 7 │ 5
───┼───┼───╫───┼───┼───╫───┼───┼───6 │ 7 │ 5 ║ 4 │ 9 │ 1 ║ 2 │ 8 │ 3
═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══1 │ 5 │ 4 ║ 2 │ 3 │ 7 ║ 8 │ 9 │ 6
───┼───┼───╫───┼───┼───╫───┼───┼───3 │ 6 │ 9 ║ 8 │ 4 │ 5 ║ 7 │ 2 │ 1
───┼───┼───╫───┼───┼───╫───┼───┼───2 │ 8 │ 7 ║ 1 │ 6 │ 9 ║ 5 │ 3 │ 4
═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══5 │ 2 │ 1 ║ 9 │ 7 │ 4 ║ 3 │ 6 │ 8
───┼───┼───╫───┼───┼───╫───┼───┼───4 │ 3 │ 8 ║ 5 │ 2 │ 6 ║ 9 │ 1 │ 7
───┼───┼───╫───┼───┼───╫───┼───┼───7 │ 9 │ 6 ║ 3 │ 1 │ 8 ║ 4 │ 5 │ 2 sudoku costs 128ms to analyze this problem进程已结束,退出代码0

答案

数独程序求解世界最难数独——JAVA版相关推荐

  1. Python来处理数独游戏(含世界最难数独示例)

    数独(sudoku)是一种填数字的游戏,在一个9*9的九宫格里面推导出剩余的数字,要求每行.每列.每宫(3*3)的数字均包含1~9,且不重复! 另:世界最难数独(题目中的最后一个数独)被江苏扬州一位农 ...

  2. 我的世界刷铁机java版_我的世界:刷铁机其实很容易制作,但是有一个特殊的限制条件!...

    文/超级游戏演说家 大家好,我是超级游戏演说家,一个美貌与智慧并存的男子.前世的千百次轮回,才换得今生的一次相遇.为了让小伙伴们更好地了解游戏中的内容,希望大家能动动小手关注一下. 本期内容 往期的内 ...

  3. 我的世界基岩版种子和java版种子_我的世界:基岩版4大最神奇种子?快点拿小本本记下来!...

    大家好,这里是我的世界老炮,一个热爱我的世界的普通玩家.上次我给大家分享了几个JAVA版的地图种子,在投票里发现有很多基岩版玩家.所以这次就来分享一些我的世界基岩版种子. 因为我的世界的基岩版和Jav ...

  4. 我的世界基岩版种子和java版种子_我的世界:两个基岩版“神种”,55米高的前哨站,裸露的村庄要塞...

    作为一个喜欢用电脑玩游戏的玩家,迷恋一直以来使用较多的都是<我的世界>Java版,这一点经常看我文章的玩家应该也十分清楚.正是因为本人基岩版玩的过少,因此每次地图种子推荐的时候都是以Jav ...

  5. 我的世界基岩版种子和java版种子_我的世界:值得珍藏3个种子,号称MC最“完美”的三座山脉!...

    通常来说,<我的世界>很少生成一些神奇的山脉.只有巨大化世界地形下,才有可能产生神奇而美丽的山脉.而今天,我叫Minecraft将改变你的想法! 巨大化世界下的"山脉" ...

  6. 我的世界1 11java,Editing Java版Alpha v1.0.11

    Anti-spam check. Do not fill this in!{{version nav |title=Alpha v1.0.11 |edition=java |image=Alpha v ...

  7. 我的世界刷猪人塔java版_我的世界主世界僵尸猪人刷怪塔制作教程

    僵尸猪人会掉落金粒和其他的装备,是非常好的获得金子方法,不过僵尸猪人比较难打,所以我们需要制作一个僵尸猪人刷怪塔,今天游戏园小编就为大家带来了我的世界主世界僵尸猪人刷怪塔的教程,希望大家能够喜欢! 总 ...

  8. java我的世界1.14.4_Minecraft Java版 1.14.4 发布

    MC-150623 - The game crashed whilst rendering overlay: Unable to fit texture MC-150623 - 游戏在渲染遮盖层的时候 ...

  9. 我的世界基岩版种子和java版种子_我的世界:对萌新最友好的种子,基岩版通用,对老玩家也很适合!...

    很多萌新再知道了"种子"这东西之后,就会在MC的频道上询问大佬们,有没有适合萌新的种子,其实这个是有的,只是如果别人推荐种子的话,总觉得里面的东西已经被大家说完了,自己再去玩就没有 ...

  10. 我的世界刷猪人塔java版_我的世界速攻猪人塔详解 史上最牛的经验塔

    我的世界速攻猪人塔详解 史上最牛的经验塔.那下面给大家分享的这个是一个可以让所有经验塔自叹不如的速攻猪人塔哦~那到底这个塔是什么呢?那下面就给大家详细的介绍一下吧!有感兴趣的玩家不妨进来看看哦~希望大 ...

最新文章

  1. Python——阶段总结(一)
  2. vue的多选框存储值操作
  3. leetcode 滑动窗口小结 (二)
  4. 【DB2】delete大表不记录日志的正确操作
  5. nignx解决vue部署服务器刷新页面出现404问题
  6. spring云化架构迁移 (一)
  7. 苹果关掉200m限制_苹果手机200m限制取消教程 苹果怎么下载超过200m的软件
  8. 禁止使用搜狗浏览器打开QQ邮箱,更换成其他邮箱
  9. 【1024个人爆款文章】Android 安卓原生UI实现游戏《俄罗斯方块》,算法太多,把我写崩溃了,附源码
  10. 孕妇饮食禁忌隐私政策
  11. 校内互测题 by LMY (FSN)
  12. Linux NAND FLASH驱动程序分析(mini2440)
  13. EPICS教程5 -- areaDetector模块安装
  14. 计算机三级 网络技术 大题第一题 答题技巧分享
  15. php国际青少年书画大赛,【水墨童心】第五届 国际青少年书画大赛征稿通知
  16. 2017年小老虎博客排名与访问量备忘录
  17. 如何便捷绘制上海地铁图?
  18. 最有用的Java免费自学网站
  19. 三星总裁强硬回应华为,未来十年三星依然领先!
  20. 鸟哥的私房菜00--计算器概论

热门文章

  1. ubuntu安装文泉驿字体
  2. SVN分支合并冲突解决
  3. python安装汉化插件及翻译插件
  4. 信捷PLC XD/XL系列C语言功能块的应用
  5. IEC 60335-2-21:2022 安全-第2-21部分:储水式热水器的特殊要求
  6. 火山PC大漠插件源码开源学习--木塔老师
  7. mysql varbinary blob_从数据库中读取SQL Varbinary Blob
  8. python如何获取免费的可以商用的字体
  9. Java编码规范总结
  10. adb工具下载及配置使用