阅读《Lua程序设计(第4版)》---2
八皇后问题
N = 8 ---棋盘的大小 count=0 ---皇后列位置一维数组,递推的第几个不互相攻击的皇后,当前皇后的列位置 function isplaceok(a,n,c) count = count + 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) 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 ---把从‘n’到N的所有皇后放在棋盘“a”上 function addQueen(a,n) if (n > N) then printsolution(a) ---练习2.1 修改八皇后问题的程序,使其在输出第一个解后即停止运行。 --io.read() --os.exit() else for c=1,N do if isplaceok(a,n,c) then --把第n个皇后放置列c a[n] = c addQueen(a,n+1) end end end end addQueen({},1) local iCount1 = count ---练习2.2 解决八皇后问题的另一种方式是,先生成 1-8 之间的所有排列,然后依此遍历这些排列,检查每一个排列是否是问题的有效解。 ---请使用这种方法编写程序,并对比新旧程序之间的性能差异(提示: 比较调用isplaceok 函数的次数) local q = {} local function slowEightQueen() count = 0 for a = 1 , N do q[1] = a for b = 1,N do q[2] = b for c = 1,N do q[3] = c for d = 1,N do q[4] = d for e = 1,N do q[5] = e for f = 1,N do q[6] = f for g = 1,N do q[7] = g for h = 1,N do q[8] = h local isOk = false for row = 2,N do isOk = isplaceok(q,row,q[row]) if not isOk then break end end if isOk then printsolution(q) end end end end end end end end end end slowEightQueen() local iCount2 = count print("addqueen isplaceok Count:"..iCount1) print("slowEightQueen isplaceok Count:"..iCount2)