版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/86548257
书中源程序
N=8
printCnt=0
isokCnt=0
times=os.clock()
function isplaceok(a,n,c)
isokCnt=isokCnt+1
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)
printCnt=printCnt+1
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)
print(printCnt)
print(isokCnt)
print(os.clock()-times)
运行结果(CPU时间因机器而异)
92
15720
4.047
练习
练习2.1
只需在addqueen函数递归调用处加上判断即可,当输出一个解后递归返回后立即判断成立不再进行任何冗余递归。
修改后的addqueen函数(加了个 if 判断)
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)
if printCnt==1 then
return
end
end
end
end
end
X - - - - - - -
- - - - X - - -
- - - - - - - X
- - - - - X - -
- - X - - - - -
- - - - - - X -
- X - - - - - -
- - - X - - - -
1
876
0.05
练习2.2
采用穷举法求解八皇后问题~就是个深度优先搜索。深搜产生1~8的所有排列,然后验证每个排列的合理性。(1~8排列不要重复,如果重复会产生多得多的排列可能——34112320次isplaceok)
N=8
printCnt=0
isokCnt=0
times=os.clock()
function isplaceok(a,n,c)
isokCnt=isokCnt+1
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)
printCnt=printCnt+1
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
book={0,0,0,0,0,0,0,0}
function addqueen(a,n)
if n>N then
for i=2,N do
if isplaceok(a,i,a[i])==false then
return
end
end
printsolution(a)
else
for c=1,N do
if book[c]==0 then
a[n]=c
book[c]=1
addqueen(a,n+1)
book[c]=0
end
end
end
end
addqueen({},1)
print(printCnt)
print(isokCnt)
print(os.clock()-times)
92
100436
4.236
结果显示,速度略慢于书中给出的检查合理后排序的方法。实际上先检测的方法会在排序上消耗很多检测合理性的时间,先搜索所有排列可能,再依次验证合理性会在最后检测所有可能合理性上消耗很多时间,两种方法本质是一样的。
结论是书中给出的先检测合理性再排序的方法更好些 ~ ~