在上海乘坐地铁的朋友都知道上海地铁站免费赠阅的时代报上经常会刊登有数独这个益智游戏如果用纸和笔人工去算的话恐怕你要花上老半天功夫了有时候还不一定能解出来心中一定很郁闷吧?网上也有一些数独游戏的求解计算器不过我想与其直接拿来主义还不如自己研究编一个呢!所以花了大概有一个多月的时间来编写了这样一个数独求解软件由于不是利用所谓的穷举算法所以如果数独游戏非唯一解的话它就只提供最先找到的那个解不过请放心肯定是正确的!下面我就来详述一下这个算法的精要
定义一个类代表数独游戏中的每一个数它有如下属性 #region 属性
/// <summary>
/// 数值
/// </summary>
public int Num
{
set
{
if (UnFilled)
{
_num = value;
_unfilled = false;
ChoicesClear();
SetNumEvent(this);
}
}
get { return _num; }
}
/// <summary>
/// 行坐标
/// </summary>
public int Xpos
{
set { _x = value; }
get { return _x; }
}
/// <summary>
/// 列坐标
/// </summary>
public int Ypos
{
set { _y = value; }
get { return _y; }
}
/// <summary>
/// 是否已填充的标记
/// </summary>
public bool UnFilled
{
get { return _unfilled; }
}
/// <summary>
/// 候选数列表
/// </summary>
public List<int> Choices
{
set { _choices = value; }
get { return _choices; }
}
#endregion
在求解的主类里根据游戏的规则设计这样一套算法当某一个数值被设定以后与它同行或同列的以及在同一个九宫里的数的候选数列里都要去掉这个数本身数独游戏中出现的数为已知数需要我们填补的则是未知数未知数需要我们去试解不过在试解之前先要备份初始化以后的数组矩阵以备在前一次试解失败以后进行恢复再进行下一次试解直到试解成功为止
算法本身看上去不是太复杂但是涉及到一个遍历和回滚的问题所以在编程的时候还是要注意一下的
下面我就来简单介绍一下这个数独求解软件的操作和使用方法
软件总体来说还是操作比较简单的但是由于当时编写的时候只是想给自己用的所以并没有设计菜单和帮助文档用户在输入初始数据的时候可以用上下左右方向键或者ASDF来进行跳格如果数错了在按确定按钮以前可以按Back Space或Delete键进行修改一旦按了确定按钮就只得按F清空后重新输入了
软件下载地址
源码下载地址
下载所要的资源分可能是高了点不过绝对是原创作品前后花了一个多月才完成的本人自我感觉应该是物有所值的谢谢大家支持原创作品!