大家知道数独吗?
九宫格数独,是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数字谜题。数独盘面是个九宫,每一宫又 分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一 宫中都只出现一次。这种游戏全面考验做题者观察能力和推理能力,虽然玩法简单,但数字排列方式却千变万化,所以不少教育者认为数独是训练头脑的绝佳方式
刚开始接触这种戏的时候,我是茶饭不思,一天的时间将我那本书上所有难度的题目全部解决,最长的一个花了将近3小时的时间。后来觉得自己用手算没意思,便想用c语言写一个程序还解数独。不过,那时的我“功力尚浅”,自然没能解决这个问题。
最近在学算法的时候,看到了回溯的那一章。自己认认真真的想了一下回溯的过程,发现与解数独很类似:自己手算数独遇到一个空有两种可能,我假设其中一个成立,推理下去。如果后面遇到矛盾就退回来,另外一个可能肯定就是了。
好了,我思考了一下。将解数独的伪代码写了出来:
如果填好的数是81,就代表问题解决,打印结果
否则:
选择一个没有填数的位置
For(i = 1;i < 10;i++){
如果i能填入这里(利用数独规则)
填入i,进入下一次回溯
恢复回溯前的状态
否则
Continue
}
回溯使用了递归,所以整个程序很简洁。将上面的源代码转换成c代码如下