深度搜索----深度搜索解决数独问题

深度搜索----深度搜索解决数独问题

1.深度优先搜索(DFS)

从某个状态开始,不断的转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。

2.数独问题

给定数列a,判断是否可以从中选出若干个数,使他们的和恰好为k。

输入:

n=4

a={1,2,4,7}

k=13

输出:

Yes

3.数独问题分析与实现

由于数列中每个数存在加或者不加两种状态,那么可绘制二叉状态树如下:

算法实现:

public class AlgorithmCenter200713
    {
        private int k=11;
        private int n=4;
        private int[] a= {1,2,4,7};
        /// <summary>
        /// 数独问题
        /// 采用深度搜索方法解决数独问题
        /// 数独问题:给定一个数列和一个数k,能不能从数列中找出几个数使其和等于k
        /// [1,2,4,7]   k=13 => 2+4+7=13
        /// </summary>
        /// <returns></returns>
        public bool SolutionSudokuProblemByDfs(int i,int sum)
        {
            if (i == n-1)
                return sum+a[i] == k;
            
            //剪枝
            if (sum > k)
                return false;

            //当前数加,进入下一个数(走左边分支)
            if (SolutionSudokuProblemByDfs(i + 1, sum+a[i]))
                return true;

            //当前数不加,进入下一个数(走右边分支)
            if (SolutionSudokuProblemByDfs(i + 1, sum))
                return true;

            return false;
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
深度优先搜索是一种常见的解决数独问题的算法。其基本思路是从数独棋盘的左上角开始,依次填入数字,每个数字填入之前都进行判断,如果填入的数字与当前行、列、宫中已经填入的数字不冲突,则继续填下一个数字,直到填满整个数独棋盘。如果填入的数字与已经填入的数字冲突,则回溯到之前的位置重新选择数字进行填充,直到找到解或者所有的情况都尝试完毕。 具体实现时,可以使用递归函数来实现深度优先搜索。在递归函数中,首先判断当前位置是否已经填满,如果是,则返回 true,表示已经找到解;否则,依次尝试 1 到 9 这 9 个数字,对于每个数字,判断是否合法,如果合法,则将其填入当前位置并递归到下一个位置,如果递归返回 true,则表示已经找到解,否则撤销填入的数字,继续尝试下一个数字。如果所有的数字都尝试完毕,都没有找到解,则返回 false。 下面是一个使用深度优先搜索解决数独问题的示例代码: ```python def solveSudoku(board): """ :type board: List[List[str]] :rtype: void Do not return anything, modify board in-place instead. """ def isValid(x, y, val): for i in range(9): if board[x][i] == val or board[i][y] == val or board[(x//3)*3+i//3][(y//3)*3+i%3] == val: return False return True def dfs(x, y): if y == 9: x, y = x+1, 0 if x == 9: return True if board[x][y] != '.': return dfs(x, y+1) for val in range(1, 10): if isValid(x, y, str(val)): board[x][y] = str(val) if dfs(x, y+1): return True board[x][y] = '.' return False dfs(0, 0) ``` 在上面的代码中,isValid 函数用于判断填入的数字是否合法,其中 x 表示行坐标,y 表示列坐标,val 表示填入的数字。对于每个数字,分别判断其所在行、所在列、所在宫是否已经填入过该数字,如果已经填入过,则返回 False,否则返回 True。 dfs 函数用于进行深度优先搜索,其中 x 表示当前搜索的行号,y 表示当前搜索的列号。如果当前位置已经填满,则继续搜索下一个位置,如果已经搜索到了最后一行,则表示已经找到解,返回 True。如果当前位置没有填入数字,则依次尝试 1 到 9 这 9 个数字,对于每个数字,判断是否合法,如果合法,则将其填入当前位置并递归到下一个位置,如果递归返回 True,则表示已经找到解,否则撤销填入的数字,继续尝试下一个数字。如果所有的数字都尝试完毕,都没有找到解,则返回 False。 最后,调用 dfs(0, 0) 函数即可解决数独问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪舟子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值