lua 实现八皇后(回溯法和全排列法)

分别使用回溯法和全排列解决

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
    -- if n>N and F==0 then -- 输出第一个解后结束
        printsolution(a)
        Num = Num + 1
        F = 1
    else
        for c = 1, N do
            if (isplaceok(a,n,c)) then
                DFS_judge_times = DFS_judge_times + 1
                a[n] = c
                addqueen(a, n+1)
            end
        end
    end
end

function permute(list, start, endTable)
    start = start or 1
    endTable = endTable or {}
    if start > #list then
        -- table.insert(endTable, table.concat(list, ", "))
        table.insert(endTable, {table.unpack(list)})
    else
        for i = start, #list do
            list[start], list[i] = list[i], list[start] -- 交换元素
            permute(list, start + 1, endTable)
            list[start], list[i] = list[i], list[start] -- 交换回来
        end
    end
    return endTable
end

function get_full_permutation(n)
    -- 使用示例
    local items = {}
    for i = 1, n do
        items[i] = i
    end
    return permute(items)
end

function solve_by_perm()
    local allPermutations = get_full_permutation(8)
    local ans_num = 0
    for _, perm in ipairs(allPermutations) do
        local isOk = true
        for row, col in ipairs(perm) do
            if isplaceok(perm, row, col) == false then
                PERM_judge_times = PERM_judge_times + 1
                isOk = false
                break
            end
        end
        if isOk then
            printsolution(perm)
            ans_num = ans_num + 1
        end
    end
    print("答案数量", ans_num)
end

F = 0
Num = 0
DFS_judge_times = 0
PERM_judge_times = 0

addqueen({}, 1)
print ("解的数量", Num)

solve_by_perm()

print("回溯调用 isplaceok的次数:", DFS_judge_times)
print("全排列调用 isplaceok 的次数:", PERM_judge_times)
下面是使用Lua语言编程实现伴随求矩阵的逆的示例代码: ```lua -- 定义矩阵A local A = {{1, 2, 3}, {4, 5, 6}, {7, 8, 10}} -- 定义矩阵的行列数 local n = #A -- 计算矩阵A的行列式值 local det = 0 for i = 1, n do local temp = 1 for j = 1, n do temp = temp * A[j][(i + j - 2) % n + 1] end det = det + temp end for i = 1, n do local temp = 1 for j = 1, n do temp = temp * A[n - j + 1][(i + j - 2) % n + 1] end det = det - temp end -- 计算矩阵A的伴随矩阵 local adj = {} for i = 1, n do local row = {} for j = 1, n do local temp = {} for k = 1, n do if k ~= i then local temp_row = {} for l = 1, n do if l ~= j then table.insert(temp_row, A[k][l]) end end table.insert(temp, temp_row) end end local temp_det = 0 for k = 1, n - 1 do local temp_temp = 1 for l = 1, n - 1 do temp_temp = temp_temp * temp[l][(k + j - 2) % (n - 1) + 1] end temp_det = temp_det + temp_temp end for k = 1, n - 1 do local temp_temp = 1 for l = 1, n - 1 do temp_temp = temp_temp * temp[n - l][(k + j - 2) % (n - 1) + 1] end temp_det = temp_det - temp_temp end if (i + j) % 2 == 0 then temp_det = -temp_det end table.insert(row, temp_det) end table.insert(adj, row) end -- 计算矩阵A的逆矩阵 local A_inv = {} for i = 1, n do local row = {} for j = 1, n do table.insert(row, adj[i][j] / det) end table.insert(A_inv, row) end -- 打印矩阵A的逆矩阵 for i = 1, n do for j = 1, n do io.write(A_inv[i][j] .. " ") end io.write("\n") end ``` 在上面的代码中,我们首先定义矩阵A和矩阵的行列数n,然后计算矩阵A的行列式值det。接着,使用嵌套循环计算矩阵A的伴随矩阵adj。然后,使用嵌套循环计算矩阵A的逆矩阵A_inv,最后将逆矩阵打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值