深度搜索----深度搜索解决数独问题
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;
}
}