经典回溯算法 八皇后 解法

经典回溯算法 八皇后 解法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

回溯法又称作动态穷举法。下面来看一下具体的实现思路。

一个皇后的具体位置必须满足以下条件:

  1. 该皇后所在行没有其它皇后
  2. 该皇后的所在列没有其它皇后
  3. 该皇后所在的对角线没有其它皇后(这里的对角线分为正对角线和反对角线)

满足以上三个条件。那么我们可以说这个皇后的位置正确

可以先看看思路
现有一个8x8的棋盘,但是下标从0开始。于是第一个皇后可以直接站在(0,0)的位置。第二个皇后选取位置的时候,(1,0)已经不行了,因为在0列上已经有第一个皇后了。选取第二个位置(1,1),也是不行的,处于第二个皇后的对角线上,选取第三个位置(1,2),没有问题。选取第n个皇后的位置判定失败,那么就回溯上一级,重新调整位置。

下面给出具体实现(js描述)

//皇后容器
let queenArr = []
//皇后的个数
const QUEEN_COUNT = 8
//解法的个数
let sum = 0

//初始化皇后
function initqueen(){
    for(let i = 0;i < QUEEN_COUNT;i++){
        queenArr.push({
            row:-1,
            column:-1
        })
    }
}

//判断皇后当前位置是否合法
function isRight(row, column){
    let currentqueen
    for(let r = 0;r < row;r++) {
        currentqueen = queenArr[r]
        if( 
            //是否处于同一列
            currentqueen.column == column ||
            //是否处于同一正对角线
            (currentqueen.column + currentqueen.row) == (row + column) || 
            //是否处于同一负对角线
            (currentqueen.column - currentqueen.row) == (column - row)
        ) return false
    }
    return true
}

//匹配皇后的位置
function matchqueen(row){
    for(let column = 0;column < QUEEN_COUNT;column++){
        //判断当前位置是否合法
        if(isRight(row, column)) {
            queenArr[row].row = row
            queenArr[row].column = column
            // 是否达到最后一行
            if(row == 7) {
                sum++
                printDiagram()
                return
            }
            matchqueen(row + 1)
        }
    }
}

//创建图
function createDiagram(){
    let diagram = []
    for(let i = 0;i < QUEEN_COUNT;i++){
        diagram.push([])
        for(let j = 0;j < QUEEN_COUNT;j++) {
            diagram[i][j] =  0
        }
    }
    return diagram
}

//输出图
function printDiagram(){
    let diagram = createDiagram()
    for(let i = 0;i < QUEEN_COUNT;i++){
        diagram[queenArr[i].row][queenArr[i].column] = 1
    }
    console.log(diagram)
    console.log("\n")
}

initqueen()
matchqueen(0)


console.log(sum)

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
八皇后问题是一个经典的算法问题,目标是在一个8x8的棋盘上放置8个皇后,使得它们互相之间不能相互攻击。这里给出一种常见的解法,使用回溯算法实现: 1. 创建一个8x8的二维数组作为棋盘,初始化所有元素为0,表示空格。 2. 从第一行开始,逐行放置皇后。对于每一行,从左到右遍历每个列,尝试将皇后放置在当前位置。 3. 如果当前位置可以放置皇后(即不会与已经放置的皇后相互攻击),将当前位置标记为1,并进入下一行。 4. 如果当前位置无法放置皇后,则回溯到上一行,继续尝试下一个列。 5. 当所有皇后都放置完毕时,得到一个解。可以将解存储起来或进行其他操作。 6. 继续回溯,寻找其他解法。 下面是一个简单的示例代码: ```python def is_safe(board, row, col): # 检查当前位置是否与已经放置的皇后冲突 # 检查列 for i in range(row): if board[i][col] == 1: return False # 检查左上方对角线 i, j = row - 1, col - 1 while i >= 0 and j >= 0: if board[i][j] == 1: return False i -= 1 j -= 1 # 检查右上方对角线 i, j = row - 1, col + 1 while i >= 0 and j < 8: if board[i][j] == 1: return False i -= 1 j += 1 return True def solve_n_queens(): board = [[0] * 8 for _ in range(8)] solutions = [] def backtrack(row): if row == 8: # 找到一个解,将棋盘状态添加到结果列表中 solutions.append([row[:] for row in board]) return for col in range(8): if is_safe(board, row, col): board[row][col] = 1 # 放置皇后 backtrack(row + 1) # 继续下一行 board[row][col] = 0 # 撤销放置的皇后 backtrack(0) return solutions # 调用函数并打印所有解法 solutions = solve_n_queens() for solution in solutions: for row in solution: print(row) print() ``` 这段代码会输出所有的八皇后问题解法,每个解法是一个8x8的棋盘,其中1表示皇后的位置,0表示空格。希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值