首页 > 编程语言 >搜索算法练习——八皇后问题

搜索算法练习——八皇后问题

时间:2024-04-01 13:00:12浏览次数:40  
标签:return 练习 搜索算法 board 皇后 棋盘 col row

八皇后问题是一个经典的回溯算法问题,其目标是在8×8的棋盘上放置八个皇后,使得它们彼此之间不会相互攻击,即任意两个皇后都不在同一行、同一列或同一斜线上。

我们可以使用回溯算法来解决这个问题,其中深度优先搜索(DFS)用于尝试每个可能的放置位置。

def is_safe(board, row, col):
    """
    检查在棋盘上的指定位置是否安全,即是否可以放置皇后。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
        row (int): 要检查的行。
        col (int): 要检查的列。
    
    Returns:
        bool: 如果在该位置放置皇后是安全的,则返回True,否则返回False。
    """
    # 检查同一列上是否已经存在皇后
    for i in range(row):
        if board[i][col] == 1:
            return False
    
    # 检查左上方斜线上是否已经存在皇后
    for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
        if board[i][j] == 1:
            return False
    
    # 检查右上方斜线上是否已经存在皇后
    for i, j in zip(range(row-1, -1, -1), range(col+1, len(board))):
        if board[i][j] == 1:
            return False
    
    return True

def solve_queens(board, row):
    """
    使用回溯算法解决八皇后问题。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
        row (int): 当前行号。
    
    Returns:
        bool: 如果找到了解决方案,则返回True,否则返回False。
    """
    if row >= len(board):
        return True
    
    for col in range(len(board)):
        if is_safe(board, row, col):
            board[row][col] = 1
            if solve_queens(board, row + 1):
                return True
            board[row][col] = 0
    
    return False

def print_board(board):
    """
    打印棋盘。
    
    Parameters:
        board (list): 当前棋盘的状态,表示为一个二维列表。
    """
    for row in board:
        print(" ".join(map(str, row)))
    print()

# 初始化一个空棋盘
board = [[0] * 8 for _ in range(8)]

# 解决八皇后问题
if solve_queens(board, 0):
    print("八皇后问题的解决方案:")
    print_board(board)
else:
    print("未找到解决方案。")

在上述代码中,我们首先定义了两个辅助函数:

  1. is_safe(board, row, col):用于检查在棋盘上的指定位置是否安全,即是否可以放置皇后。
  2. solve_queens(board, row):使用回溯算法解决八皇后问题。在每一行中,我们尝试将皇后放置在所有可能的位置,并使用深度优先搜索(DFS)来递归地探索每个可能性。

然后,我们初始化一个空棋盘,并调用 solve_queens 函数来解决八皇后问题。如果找到解决方案,则打印棋盘状态;否则,打印未找到解决方案的消息。

标签:return,练习,搜索算法,board,皇后,棋盘,col,row
From: https://blog.csdn.net/SmiledrinkCat/article/details/137023071

相关文章

  • 递归例题+练习
    例题2斐波那契数列时间限制:1s内存限制:128M 题目描述斐波那契数列是一个有特殊规律的数列,它的前两项都是1,从第3项开始,该项等于前两项数字之和。现在请你输出斐波那契的第n项。【输入格式】输入共1行:第1行,1个正整数n。【输出格式】输出共1行:第1行,输出......
  • 2024年春季学期《算法分析与设计》练习5
    问题A:随机数题目描述有一个rand(n)的函数,它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数,它的代码如下:intrandom(intn,intm){        returnrand(n)+m;}显而易见的是函数random(n,m)可以产生任意范围的随机数。现在问题来了,如果我想要......
  • 练习3-2 计算符号函数的值
    对于任一整数n,符号函数sign(n)的定义如下:请编写程序计算该函数对任一输入整数的值。输入格式:输入在一行中给出整数n。输出格式:在一行中按照格式“sign(n)=函数值”输出该整数n对应的函数值。输入样例1:10输出样例1:sign(10)=1输入样例2:0输出样例2......
  • 20240331_搜索练习
    目录P3206DungeonMasterP3207LakeCountingP3208TheCastleP896仙岛求药P429【基础】走迷宫P2465迷宫问题P952【入门】算24点P3206DungeonMaster这题是一个三维迷宫,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次......
  • 00342第四章 结构化程序设计 思考题和练习题(C语言)
    一、单项选择题1.若从键盘输入字符串"HOWAREYOU?",可以直接使用库函数【】。        A.scanf    B.getstr    C.gets    D.都不能直接使用2.C语言的库函数中,可以输出double型变量值的是【】。        A.getchar   ......
  • 算法---动态规划练习-9(粉刷房子)
    题目1.题目解析2.讲解算法原理3.编写代码1.题目解析题目地址:点这里2.讲解算法原理创建dp表:vector<vector>dp(n,vector(3))。这里创建了一个二维向量dp,其中dp[i][j]表示第i天选择颜色j的最小成本。初始化第一天的成本:for(inti=0;i<3;i++)......
  • 【2024年5月备考新增】《软考真题分章练习(含答案解析) - 14 组织级项目管理(高项)》
    1题目1、办公软件开发公司A非常重视软件过程管理,按照CMMI(能力成熟度模型)逐步进行过程改进,刚刚实现了组织级过程性能、定量项目管理,按照CMMI(能力成熟度模型),A公司达到了()级别。A.CMMI2B.CMMI3C.CMMI4D.CMMI52、CMMI的连续式表示法与阶段式表示法分别表示:()。A.项......
  • n皇后问题(DFS)
    n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数 n。输出格式每个解决方案占 n 行,每行输出一个长度......
  • 8.C语言的一些练习题坑整理
    总结没有顺序之分想起一个算一个逗号表达式https://blog.csdn.net/qq_43539854/article/details/105757536(参考)设f是实型变量,下列表达式中不是逗号表达式的是_________A.f=3.2,1.0B.f>0,f<10C.f=2.0,f>0D.f=(3.2,1.0)逗号表达式即执行第......
  • L2-046 天梯赛的赛场安排 团体程序设计天梯赛-练习集 c++ 易懂 模拟
    天梯赛使用OMS监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满足以下条件:每位监考老师负责的赛场里,队员人数不得......