一.介绍
程序调用readSolutionO方法来读取一个数独的解决方案,并且返回一个表示数独网格的二维数组。isValid(grid)方法通过检査每个值是否都是从1到9的数字以及每个网格中值是否都是有效的,来确认网格中是否放入了正确的值。isValid(i,j.grid)方法检査grid[i][j]的值是否是有效的。它检査grid[i][;j]在第i行、第j列,以及3x3的方盒中是否出现超过一次。
二.代码
package com.zhuo.base;
import java.util.Scanner;
public class CheckSudocuSolution {
public static void main(String[] args) {
int[][] grid = readSolution();//读取数独解
System.out.println(isvalid(grid) ? "valid solution" : "invalid solution");
}
/*从控制台读取数独解决方案*/
public static int[][] readSolution() {
Scanner input = new Scanner(System.in);
System.out.println("Enter a sudoku puzzle solution: ");
int[][] grid = new int[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j <9; j++)
grid[i][j] = input.nextInt();
}
return grid;
}
/*检查解决方案是否有效*/
public static boolean isvalid(int[][] grid) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++)
if (grid[i][j] < 0 || grid[i][j] > 9 || !isvalid(i, j, grid))
return false;
}
return true;
}
public static boolean isvalid(int i, int j, int[][] grid) {
/*检查网格[i][j]在j的行中是否唯一*/
for (int row = 0; row < 9; row++)
if (row != i && grid[row][j] == grid[i][j])
return false;
/*检查网格[i][j]在i的行中是否唯一*/
for (int column = 0; column < 9; column++)
if (column != j && grid[i][column] == grid[i][j])
return false;
for (int row = (i / 3) * 3; row < (i / 3) * 3 + 3; row++ )
for(int col = (j / 3) * 3; col < (j / 3) * 3 + 3; col++)
if (row != i && col != j && grid[row][col] == grid[i][j])
return false;
return true;
}
}
三.结果实现
Enter a sudoku puzzle solution:
9 6 3 1 7 4 2 5 8
1 7 8 3 2 5 6 4 9
2 5 4 6 8 9 7 3 1
8 2 1 4 3 7 5 9 6
4 9 6 8 5 2 3 1 7
7 3 5 9 6 1 8 2 4
5 8 9 7 1 3 4 6 2
3 1 7 2 4 6 9 8 5
6 4 2 5 9 8 1 7 3
valid solution
Process finished with exit code 0