NewCoder:Sudoku-Java

来源:互联网 发布:windows游戏 编辑:程序博客网 时间:2024/05/22 07:58

题目描述

问题描述:数独(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所有数字都试过了,不满足,则返回falsereturn 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;}}
0 0
原创粉丝点击