检验九宫格

注意:这不是写九宫格的程序,是输入一个九宫格去检验是否正确的程序。
检验分三步,检验的是是否包含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;
		}
}

猜你喜欢

转载自blog.csdn.net/alike_meng/article/details/82935076