【算法】 八皇后问题之回溯法

简介: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。每次填满第一行第一列,当不满足时候,试下第一行第二列,依次进行,递归的出口为找到第八个点,跳出递归。,在循环里面还要判断是否满足不同行,不同列,不同对角线。使用回溯法来解决该问题,下面的代码是我看到过的最精简的代码,相关的注释都写在代码上了。运行得出结果,总共有92中结果。

1. 八皇后问题描述

  会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

2. 解题思路

  每次填满第一行第一列,当不满足时候,试下第一行第二列,依次进行,递归的出口为找到第八个点,跳出递归。,在循环里面还要判断是否满足不同行,不同列,不同对角线。

  使用回溯法来解决该问题,下面的代码是我看到过的最精简的代码,相关的注释都写在代码上了。

#define QUEEN_NUM  8
int c[QUEEN_NUM] = {0};

bool is_ok(int row)
{
    for(int i=0;i<row;i++)
    {
        //判断列和斜对角是否有与之前的皇后冲突。
        if(c[row] == c[i] || abs(c[row]-c[i]) == row-i) return false;
    }
    return true;
}
int queue(int row)
{
    static unsigned char total = 0;  //total为所有八皇后解法的个数
    if(row == QUEEN_NUM)
    {
        total++;
    }else{
       for(int col = 0;col<QUEEN_NUM;col++)
       {
           c[row] = col;
           if(is_ok(row)) //该位置可以放置
           {
               queue(row+1);//放置下一行
           }
       }
    }
    return total;
}

int main()
{
    unsigned char total = queue(0);
    printf("total = %d\n",total);
    return 0;
}

运行得出结果,总共有92中结果。

目录
相关文章
|
6月前
|
算法 Python
Python高级算法——回溯法(Backtracking)
Python高级算法——回溯法(Backtracking)
259 2
|
算法 定位技术 C++
基本算法-回溯法(迷宫问题)
基本算法-回溯法(迷宫问题)
459 0
|
28天前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
33 0
|
5月前
|
算法 Java C++
数据结构与算法===回溯法
数据结构与算法===回溯法
|
5月前
|
存储 机器学习/深度学习 算法
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
python 3种算法 回溯法、字典序生成、递归交换 实现全排列【力扣46题】
|
6月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
|
算法
【系统分析】数值算法——回溯法
【系统分析】数值算法——回溯法
102 0
|
6月前
|
算法
【算法学习】—n皇后问题(回溯法)
【算法学习】—n皇后问题(回溯法)
|
存储 人工智能 算法
【算法分析与设计】回溯法(上)
【算法分析与设计】回溯法(上)
|
存储 算法 容器
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)