Lua程序设计一书中的8皇后示例 解析

因为八皇后要求是每行每列只能放一个,所以示例中按每列坐标用一维数组表示

例子:  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 ,计算出来一样的结果

思路转变过来以后这个地方极其简单..

其余地方就没难度,只是注意整理递归的思路

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值