每日一题算法:2020年9月15日 [解数独] solveSudoku

2020年9月15日 解数独solveSudoku

在这里插入图片描述

在这里插入图片描述

class Solution {
   
    public void solveSudoku(char[][] board) {
   

    }
}

解题思路:

数独是我曾经非常喜欢玩的一款游戏,以前在步步高学习机上没有什么可以玩的游戏,所以对数独也算是有一些研究吧。

首先数独是只能有唯一解的,这道题就做得很好,他说明了数独只有唯一的解,因为之前做数独能够存在多解,那时候我解数独的方式比较类似于算法中的递归+回溯,当一个位置能填的数字存在多种可能时,我会先选择一个进行填充,当做到后面发现无解时,就把之前选择的给删掉换一个数字重新做。

数独的正确解法在我的理解里是这样的规则,在整个数独图中找到只能填写一种数字的位置,这是必然存在的这是数独能够得到唯一解的必要条件。数独就是在图中找出能够确定的数字后,寻找下一个唯一确定的数字的过程。

那么这道题的思路我们可以这么设计。

首先,这一种方法大概率不会通过,因为是最暴力的算法,我们直接使用递归,说是递归实际上就是遍历。找所有点,如果确定只能填写一个数字就把数字填上,然后再次遍历这个二维数组,直到二维数组中每一个位置都有值存在。

代码实现:
在这里插入图片描述

char[][] board;
char[] vals={
   '1','2','3','4','5','6','7','8','9'};
public void solveSudoku(char[][] board) {
   

    if (this.board==null)
        this.board= board;

    for(int i=0;i<9;i++){
   
        for (int j=0;j<9;j++){
   
            if (board[i][j]=='.'){
   
                List<Character> val = getVal(i, j);
                if (val.size()==1){
   
                    board[i][j]=val.get(0);

                    solveSudoku(board);
                    return;
                }
            }

        }
    }
    return;
}
//返回某坐标能够填充的数字
public List<Character> getVal(int x,int y){
   

    List<Character> list
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值