数据结构——DFS深度优先遍历之n皇后问题

n皇后是指将n个皇后放在n-n的国际象棋棋盘上,使皇后不能相互攻击到,即任意两个皇后不能再同一行、同一列或同一斜线上。

算法基本思路:
1.当N个皇后摆放好,依次输出
2.对每行U的0-N列遍历,比较第U个皇后是否会发生冲突(横、竖、对角线)
3.放置好后对该皇后、横、竖、斜对角线做标记,下一次放置 则不会出现在以上地方

需要变量:
q[n][n] 棋盘,不放置为‘.’,放置则为‘Q’
col[n]  bool的列标记,标记为True则该列不能再放皇后
dg[n+u-i]、udg[u+i] 对角线、反对角线bool标记

n+u-i、u+i 数学推理过程:
1.对角线函数表示 y=x+b 则截距表达为b = y-x,为防止存在负数 则表示为 n+y-x 即 n+u-i
2. 反对角线函数表示为y=-x+b 则截距表达为 b = y+x 即u+i

def dfs(u):
    if u==n:
        print(q)
        return
    for i in range(0,n):
        if !col[i] and !dg[n+u-i] and !udg[u+i]:
            q[u][i] = 'Q'
            col[i] = dg[n+u-i] = udg[u+i] = True
            dfs(u+1)
            # 回溯
            q[u][i] = '.'
            col[i] = dg[n+u-i] = udg[u+i] = False



全部评论

相关推荐

10-22 19:44
门头沟学院 Java
面了100年面试不知...:那我得去剪个头
点赞 评论 收藏
分享
前段时间投boss,实在没绷住,就发出来吧
测开小登的自我救赎:这种就别较真了,感觉应该是那种吃上了学历贬值的时代红利感觉自己也能找一堆92硕士的边角料小公司吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务