最近在学习lua,阅读Programing in Lua,里面很好了给出了Lua解决八皇后问题的代码。
为了记录一下自己的心得以及自己的理解防止之后忘记,决定写个帖子方便自己回顾。
N=8 --棋盘大小为8×8
flag=false --为了只输出一次看的清楚,true代表以有解
--判断(n,c)位置能否放皇后
function canplace(a,n,c)
for i=1,n-1 do --遍历每一个已经放置的皇后
--a[i]是指第i行的皇后位置,c表示当前的列
--a[i]==c表示当前列已经有之前的皇后
--a[i]-(i-1)表示第i行的皇后【最左下角(横坐标为1)】的坐标,例如(2,5)最左下角坐标为(1,4);(8,3)最左下角坐标为(1,-4)
--c-(n-1)表示当前位置(n,c)最左下角的坐标
--a[i]-(i-1)==c-(n-1)等价于a[i]-i==c-n即判断第i行皇后的最左下角坐标和当前位置最左下角坐标是否相等(即为左下对角线是否相等)
--a[i]+(i-1)表示第i行皇后【最右下角(横坐标为1)的】坐标,例如(2,5)最右下角坐标为(1,6);(8,3)最右下角坐标为(1,10)
--c+(n+1)表示当前位置(n,c)最右下角坐标
--a[i]+(i+1)==c+(n+1)等价于a[i]+i==c+n即判断第i行皇后的最右下角位置和当前位置最右下角位置是否相等(即为右下对角线是否相等)
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 printboard(a)
for i=1,N do
for j=1,N do
io.write(a[i]==j and "X" or "-"," ")
end
io.write("\n")
end
end
--放置皇后
function addqueen(a,n)
if n>N then
printboard(a)
flag=true --有解
elseif not flag then
for c=1,N do
if canplace(a,n,c) then
a[n]=c
addqueen(a,n+1)
end
end
end
end
addqueen({},1)