八皇后问题

作者: 凉夜lrs | 来源:发表于2020-08-26 10:30 被阅读0次
image.png

百度百科说这是回溯算法的经典案例,当时还纠结了一下啥是回溯算法,看了下解释:有冲突解决冲突,没有冲突往前走,无路可走往回退,走到最后是答案。

仔细一想,这不是深度优先+迭代,求出所有的最深路径嘛

算法实现思路(这里用Lua实现)

1. 既然要回溯,首先要判断当前皇后的位置是否合法:

function CheckValid(nRow, nCol)
    for k,v in ipairs(tRow2Col) do
        if v == nCol then
            return false
        end
        if math.abs(nRow - k) == math.abs(nCol - v)then
            return false
        end
    end

    tRow2Col[nRow] = nCol
    return true
end

因为默认从第一行找起,行数不一样,所以这里只判断列和对角线

2. 找到当前行的位置:

function FindPosByRow(nRow)
    if nRow > nCount then
        table.insert(tAllPlace, tRow2Col)  --记录所以排列
    else
        for nCol = 1,nCount do
            if CheckValid(nRow, nCol) then
                FindPosByRow(nRow + 1)
                tRow2Col[nRow] = nil  --去掉记录,以待回溯
            end
        end
    end
end

3. 最后贴上全部代码:

local nCount = 8
local tRow2Col = {}
local tAllPlace = {}

function FindPosByRow(nRow)
    if nRow > nCount then
        table.insert(tAllPlace, tRow2Col)  --记录所以排列
    else
        for nCol = 1,nCount do
            if CheckValid(nRow, nCol) then
                FindPosByRow(nRow + 1)
                tRow2Col[nRow] = nil  --去掉记录,以待回溯
            end
        end
    end
end

function CheckValid(nRow, nCol)
    for k,v in ipairs(tRow2Col) do
        if v == nCol then
            return false
        end
        if math.abs(nRow - k) == math.abs(nCol - v)then
            return false
        end
    end

    tRow2Col[nRow] = nCol
    return true
end

FindPosByRow(1)
print(#tAllPlace)

相关文章

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 算法(03)回溯

    八皇后问题

  • 八皇后问题(N皇后问题)

    八皇后问题是一个经典的递归回溯问题。 描述 八皇后问题是在一个 8*8 的棋盘上放置皇后,要求其放置后满足同一行,...

  • 八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在...

  • 八皇后问题

    问题的类别是回溯(backtrace). 回溯通常用递归实现。回溯中注意边界问题,避免越界。同时,剪枝可以减少ca...

  • 八皇后问题

    课堂上老师讲了广度优先搜索算法后让课下实现下八皇后问题,就突发奇想了很多实现方法,这里只把我的实现方式和实现代码粘...

  • 八皇后问题

    问题 八皇后问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪数学家高斯1850年手工解决。原题为在...

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • 八皇后问题

    如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任两个皇后都不能处于同一条横行、纵行或斜线上。 先从第一列开...

  • 八皇后问题

    问题描述: 在8x8的网格上,放置皇后两个皇后,两个皇后之间不能在同一行,也不能在同一列,也不能在对角线上。 cl...

网友评论

    本文标题:八皇后问题

    本文链接:https://www.haomeiwen.com/subject/zplxsktx.html