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

简介: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将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中结果。

目录
相关文章
|
1月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【短学期算法作业】八皇后问题(回溯法)
【短学期算法作业】八皇后问题(回溯法)
【短学期算法作业】八皇后问题(回溯法)
|
算法 Java
【递归与回溯算法】汉诺塔与八皇后问题详解
文章目录 1 汉诺塔问题 1.1 汉诺塔问题概述 1.2 思路分析 1.3 代码实现(Java) 1.4 结果验证 2 八皇后问题 2.1 八皇后问题概述 2.2 思路分析 2.2.1 问题划分与分析 2.2.2 涉及到的数据结构分析 2.2.3 上下对角线与行列的关系 2.3 代码实现(Java) 2.4 结果验证
【递归与回溯算法】汉诺塔与八皇后问题详解
|
机器学习/深度学习 人工智能 算法
8种人工智能算法求解八皇后问题+原理分析
8种人工智能算法求解八皇后问题+原理分析
1740 1
8种人工智能算法求解八皇后问题+原理分析
|
机器学习/深度学习 算法 C++
Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
|
算法 Java 定位技术
回溯算法 | 追忆那些年曾难倒我们的八皇后问题
首发公众号:bigsai,用通俗易懂的话详解了八皇后问题。
2490 0
回溯算法 | 追忆那些年曾难倒我们的八皇后问题
|
算法 程序员
图解算法:摘取位运算的王冠「八皇后问题」!| 算法必看系列十七
位运算在生产或算法解题中并不常见,不过如果你用得好,可以达到事半功倍的效果,而且位运算用得好,也可以极大地提升性能,如果在生产或面试中能看到使用位运算来解题,会让人眼前一亮!巧用位运算,不仅会提升性能,还会让代码的可读性更好,达到四两拨千斤的效果!
图解算法:摘取位运算的王冠「八皇后问题」!| 算法必看系列十七
|
算法
数据结构与算法之八皇后问题
八皇后问题代码实现 package com.pionner.recursion; public class Queen8 { int max = 8; int[] array = new int[max]; static int i = 0; public...
754 0