【发布时间】:2014-04-04 02:46:52
【问题描述】:
我正在尝试编写一个解决数独的程序。 我正在使用回溯来解决这个难题。
据我所知,我的代码应该可以工作,但显然不能。 我在代码的不同阶段查看了这个谜题,它根本没有改变。 我不知道该怎么办。
代码如下:
public class main {
public static int[][] originalGrid;
public static void main(String[] args){
int[][] grid = {{5, 3, 0, 0, 7, 0, 0, 0, 0},
{6, 0, 0, 1, 9, 5, 0, 0, 0},
{0, 9, 8, 0, 0, 0, 0, 6, 0},
{8, 0, 0, 0, 6, 0, 0, 0, 3},
{4, 0, 0, 8, 0, 3, 0, 0, 1},
{7, 0, 0, 0, 2, 0, 0, 0, 6},
{0, 6, 0, 0, 0, 0, 2, 8, 0},
{0, 0, 0, 4, 1, 9, 0, 0, 5},
{0, 0, 0, 0, 8, 0, 0, 7, 9}};
originalGrid = grid;
solveSudoku(grid, 0, 0);
System.out.println("Done!");
}
public static boolean solveSudoku(int[][] grid, int row, int col) {
//base case
if (noUnassignedLocation(grid)){
printGrid(grid);
return true;
}
for (int i = 0; i < 9; i++) {
if (noConflict(grid)) {
if (originalGrid[row][col] == 0)
grid[row][col] = i;
printGrid(grid);
col++;
if (col == 9) {
col = 0;
if (row != 8)
row++;
}
if (solveSudoku(grid, row, col))
return true;
grid[row][col] = 0;
col--;
if (col == 0) {
col = 9;
row--;
}
}
}
printGrid(grid);
return false;
}
public static boolean noConflict(int[][] grid) {
for (int i = 0; i < 9; i++) {
for (int j = 0 ; j < 9; j++) {
int current = grid[i][j];
//System.out.println("i: " + i + " j: " + j);
for (int k = 0; k < 9; k++) {
if (current == grid[k][j] && k != i && current != 0 && grid[k][j] != 0) {
return false;
}
}
for (int k = 0; k < 9; k++) {
if (current == grid[i][k] && k != j && current != 0 && grid[i][k] != 0) {
return false;
}
}
//check block
}
}
return true;
}
public static boolean noUnassignedLocation(int[][] grid) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (grid[i][j] == 0) {
return false;
}
}
}
return true;
}
private static void printGrid(int[][] grid) {
System.out.println("###########");
for (int i = 0; i < 9; i++) {
String line = new String();
for (int j = 0; j < 9; j++) {
line = line + grid[i][j];
}
System.out.println("#" + line + "#");
}
System.out.println("###########");
}
}
【问题讨论】:
-
提示:使用调试器...
-
哇,我什至不知道有这样的东西存在。谢谢斯蒂芬(PS:这不是讽刺)
标签: java algorithm sudoku backtracking