《Lua程序设计(第4版)》:第2章练习答案

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

结果显示,速度略慢于书中给出的检查合理后排序的方法。实际上先检测的方法会在排序上消耗很多检测合理性的时间,先搜索所有排列可能,再依次验证合理性会在最后检测所有可能合理性上消耗很多时间,两种方法本质是一样的。

结论是书中给出的先检测合理性再排序的方法更好些 ~ ~

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/86548257
今日推荐