用java解数独

大家好,很久没更新了,今天写一写解数独的算法吧,这是一道leetcode困难级别的题目,本人的算法跟真正的大神相比效率一般,花费的时间和空间都很多。不过对于大多数人来说应该是最直观,最易懂的。

这道题目考虑的是最基本的数独,也就是每行,每列,每宫都是1到9。没有其他更加复杂的规则

题目当中数独是以一种二维字符矩阵(char[][])来呈现的。那么首先我们可以创立一个全局变量nums

char[] nums={
   '1','2','3','4','5','6','7','8','9'};

这样的话在之后的执行中可以直接引用字符,不需要考虑字符与整数之间的转换。

相信很多玩过数独的人都知道数独有两种基本的排除法。
1.当一个格子不可能是其他八个数的时候,那它一定就是剩下的那一个数。
2.当一个格子所在的行\列\宫当中其它空格都不可能是某一个数的时候,那么这个格子必然是这个数。(只要符合规则)

首先我们要先写出三条规则的判定方法。

//判断所在的行没有重复的数字
public boolean checkRow(char[][] board,int row,char val){
           
	for(int i=0;i<9;i++){
               
		if(board[row][i]==val){
                   
			return false;            
		}        
	}        	
	return true;    
}

//判断所在的列没有重复的数字
public boolean checkCol(char[][] board,int col,char val){
           
	for(int i=0;i<9;i++){
               
		if(board[i][col]==val){
                   
			return false;            
		}        
	}        	
	return true;    
}

//判断所在的宫没有重复的数字,这里判断格子所在的宫稍微有点难度
public boolean checkGrid(char[][] board,int row,int col,char val){
           
	int start1=(row/3)*3; //找出左上角格子所在的行
	int start2=(col/3)*3; //找出左上角格子所在的列
	for(int i=start1;i<start1+3;i++){
   //锁定左上角格子,开始循环            
		for(int j=start2;j<start2+3;j++){
                   
			
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值