本章作为小插曲讲解如何用Lua语言编写的简单但完整的程序来解决八皇后问题(eight-quene puzzle,其目标是把8个皇后合理地摆放在棋盘上,让每个皇后之间都不能相互攻击)。

可以用一个8个数字组成的简单数组来表示可能的解决方案。例如{3, 7, 2, 1, 8, 6, 5, 4}中3即(1, 3)表示其位置,7即(2, 7),换言之,数字在数组中的位置同样表示其部分位置信息。

示例:求解八皇后问题的程序

N = 8	-- 棋盘大小

-- 检查(n, c)是否不会被攻击
function isplaceok(a, n, c)
    for i = 1, n - 1 do		-- 对于每一个已经被放置的皇后
        if(a[i] == c) or				-- 同一列?
            (a[i] - 1 == c - n) or		-- 同一对角线?
            (a[i] + 1 == c + n) then	-- 同一对角线?
			return false		-- 位置会被攻击
    	end
	end
	return true		-- 不会被攻击;位置有效
end

--  打印棋盘
function printsolution (a)
    for i = 1, N do		-- 对于每一行
        for j = 1, N do	-- 和每一列
           	-- 输出"X"或"-",外加一个空格
        	io.write(a[i] == j and "X" or "-", " ")
        end
        io.write("\n")
    end
    io.write("\n")
end

-- 把从'n'到'N'的所有皇后放在棋盘'a'上
function addqueen(a, n)\
    if n > N then		-- 是否所有的皇后都被放置好了?
        printsolution(a)
    else	-- 尝试放置第n个皇后
        for c = 1, N do
            if isplaceok(a, n, c) then
                a[n] = c	-- 把第n个皇后放在列'c'
                addqueen(a, n + 1)
            end
        end
    end
end

-- 运行程序
addqueen({}, 1)