因为八皇后要求是每行每列只能放一个,所以示例中按每列坐标用一维数组表示
例子: 1维数组{1 7 5 8 2 4 6 3} 这相当于是
二维数组以下坐标 1,1 2,7 3,5 4,8 5,2 6,4 7,6 8,3 首先明白这个概念
N=8
function Isplaceok(a,n,c)
for i=1,n-1 do
if(a[i]==c) or
(a[i] - i == c - n ) or
(a[i] + i == c + n ) then
return false
end
end
return true
end
function PrintSolution(a)
for i =1, N do
for j=1,N do
io.write(a[i]== j and "X" or "-"," ")
end
io.write("\n")
end
io.write("\n")
end
function Addqueen(a,n)
if n >N then
PrintSolution(a)
else
for c =1, N do
if Isplaceok(a,n,c) then
a[n] = c
Addqueen(a,n+1)
end
end
end
end
Addqueen({},1)
以上代码中
8皇后问题中其实最核心的判断来源是如何判断对角线
其余的打印,递归都很容易想到
最关键的地方Isplaceok方法中的
(a[i] - i == c - n )
(a[i] + i == c + n )
为什么这里可以判断对角线,因为8*8的正方形 来算 行-行=列-列
比如说1,1 和2,2 套入等式中可以得出相等的,是在对角线上
3,5 和 4,6 ,计算出来一样的结果
思路转变过来以后这个地方极其简单..
其余地方就没难度,只是注意整理递归的思路