题目描述
问题描述:数独(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; } }