Eight-queen puzzle目标是把8个皇后合理的摆放在棋盘上,使得每个皇后之间都不能互相攻击。
对于这样的一道问题我们首先可以将国际象棋棋盘抽象为一个8*8的矩阵。目标就是把8个皇后放在这样一个矩阵中,使得他们互相之间不能攻击(横向,竖向,对角线)。
分析这个问题,不难发现当我们摆放一个棋子后,对应的问题规模即可摆放棋子的位置变小了,但是摆放棋子的思路确并不会改变都是需要我们去尝试当前行的所有列,然后根据题目限制条件判断是否可行。这自然而然的提醒我们采用递归的思路去解决问题。既然要用到递归,我们就需要确认终止条件,否则程序将无休止的运行下去,直到爆栈。这个问题的终止条件其实也比较容易想到,当我们要尝试的行大于棋盘的总行数时,程序应当停止,并输出相应的解决方案。 但是,这里会碰到一个问题,程序执行中代码是顺序执行的,而当我们确认某一列不能摆放棋子时,我们应当回溯到之前的条件下,这时就要用到回溯算法(BackTracking)来保证我们每次都能回退到相同的条件情况。
确认了思路之后,附上相应的Lua代码来解决这个问题。
N = 8
function addqueen(a, n)
if n > N then
printsolution(a) --所有的皇后已经放置好了