注意:这不是写九宫格的程序,是输入一个九宫格去检验是否正确的程序。
检验分三步,检验的是是否包含1到9的数字:
每一行
每一列
整齐排列的9个小正方形
import java.util.Scanner;
public class ChecksudokuSolution {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[][] grid = readASolution();
System.out.println(isValid(grid)?"Valid Solution" : "Invalid Solution");
}
public static int[][] readASolution(){
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++)
if(!isOneToNine(grid[i])) //检验行
return false;
for(int j=0;j<9;j++) {
int[] column = new int[9];
for(int i=0;i<9;i++)
column[i]=grid[i][j]; //把列放进一个column数组并检验
if(!isOneToNine(column))
return false;
}
//以下这一整坨循环实现的是左上角的(1,2,3行,1,2,3列)3*3正方形
//再向右移动一列到(1,2,3行 4,5,6列)一直移动到右上角(1,2,3行 7,8,9列),再到(3,4,5行,1,2,3列的正方形)
//并不是要检查所有的正方形,只检查(3*i,3*j)的正方形,这个循环只检查了9个3*3正方形
for(int i=0 ; i<3 ; i++) {
for(int j=0;j<3;j++) {
int k=0;
int[] list = new int[9]; //把3*3方格存在一个一维数组里面
for(int row = i*3;row<i*3+3;row++)
for(int column = j*3;column< j*3+3;column++)
list[k++]=grid [row][column];
if(!isOneToNine(list))
return false;
}
}
return true;
}
public static boolean isOneToNine (int[] list) { //检查方法是先排序了再一一对应
int[] temp= new int[list.length];
System.arraycopy (list, 0, temp, 0, list.length);
java.util.Arrays.sort(temp);
for(int i=0;i<9;i++) {
if (temp [i] != i+1)
{
return false;
}
}
return true;
}
}