题目描述
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。
输入:包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出:完整的9X9盘面数组
输入描述:包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出描述:完整的9X9盘面数组
import java.util.Scanner;
public class NC_044_Sudoku_Java {
public static void main(String[] args) {
// int[][] board = {
// {0,9,2,4,8,1,7,6,3},
// {4,1,3,7,6,2,9,8,5},
// {8,6,7,3,5,9,4,1,2},
// {6,2,4,1,9,5,3,7,8},
// {7,5,9,8,4,3,1,2,6},
// {1,3,8,6,2,7,5,9,4},
// {2,7,1,5,3,8,6,4,9},
// {3,8,6,9,1,4,2,5,7},
// {0,4,5,2,7,6,8,3,1}};
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int[][] board = new int[9][9];
for(int i = 0; i < 9; i++){
String second = sc.nextLine();
String[] sStr = second.split(" ");
for(int j = 0; j < 9;j++){
board[i][j] = Integer.parseInt(sStr[j]);
}
}
boolean b = sudoku(board);
}
}
/**
* 打印数独棋盘
* @param map 数独棋盘
*/
public static void printBoard(int[][] map) {
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(j==0){
System.out.print(map[i][0]);
}else {
System.out.print(" " + map[i][j]);
}
}
System.out.println();
}
}
/**
* @param board 待完善的数独棋盘
* @return
*/
public static boolean sudoku(int[][] board){
for(int i = 0; i<board.length;++i){
for(int j = 0;j<board[0].length;++j){
if(board[i][j] == 0){//存在空白处
for(int k=1;k<=9;++k){
board[i][j] = k;
if(isBoard(board,i,j) && sudoku(board)){
return true;
}else {
board[i][j] = 0;
}
}
//0-9所有数字都试过了,不满足,则返回false
return false;
}
}
}
printBoard(board);//所有数字填写完成之后,打印
return true;
}
/**
* @param board 数独棋盘
* @param x 棋盘坐标x
* @param y 棋盘坐标y
* @return boolean 是否符合棋盘的条件
*/
public static boolean isBoard(int[][] board,int x, int y){
int i;
int j;
//先检查列
for(i = 0;i < 9; i++){//同一行绝对不会出现一个数字出现两次的情况
if(i!=x && board[i][y] == board[x][y]){//检查y列
return false;
}
}
//检查行元素
for(j = 0; j < 9; j++){
if(j!=y && board[x][j] == board[x][y]){//检查x行
return false;
}
}
//检查子单元是否满足九宫格
for(i = 3*(x/3); i < 3*(x/3+1); i++){//(i=x/3;i<x/3+1;i++)
for(j=3*(y/3); j < 3*(y/3+1); j++){
if((i!=x || j!=y) && board[x][y] == board[i][j]){
return false;
}
}
}
return true;
}
}