NewCoder:Sudoku-Java

题目描述

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值