`

C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)

阅读更多
C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)

转载请注明出处:http://hi.baidu.com/ipress/

八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名
的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即
任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。       

高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后
来有人用图论的方法解出92种结果。事实上就是有92种解法。

了解了基本的原理后,我们开始分析:

1.我们需要一个数据存放已经放置皇后的位置,用指针表示的一维数据*position,长度为N(N为放置的皇后总数),可能有人会问为什么不用二维数组,用下票i,j准备定位,事实是这样的,因为该问题是每行,每列,每组对角线只可能出现一个皇后,所以用一维数据position+i中的i则能代码第几行,而值*(position+i)则表示该行中的列值,其实质与二维数组无异.

2.判断每行可放置皇后,假设要判断第n行,则从position中从0到n-1每一个已放皇后的位置判断(列,对角线)

具体算法如下:

// 转载请注明出处 http://hi.baidu.com/ipress/

#include <iostream>
#include <math.h>
#include <malloc.h>

using namespace std;

int *position; //放置的位置
int queen; //皇后数目
int count; //第N种可能性

//判断第n行是否放置皇后
bool SignPoint(int n)
{
for (int i=0;i<n;i++)
{
   if (*(position+i) == *(position+n)) //该列已经放置过皇后了
    return false;
   if (abs(*(position+i) - *(position+n)) == n-i) //对角线已经放置过了
    return false;
}
return true;
}

//设置皇后
void SetQueen(int n=0)
{
if (queen==n)
{
   //该处可以改成自己想要的显示方式
   printf("NO.%d: ",++count);
   printf("\n");
   for (int i=0;i<queen;i++)
   {
    for (int j=0;j<queen;j++)
    {
     if (j == position[i])
     {
      printf("* ");
     }
     else
     {
      printf("0 ");
     }
    }
    printf("\n");
   }
   printf("\n");
   return;
}
else
{
   for (int i=0;i<queen;i++)
   {
    position[n] = i;

    if(SignPoint(n))//如果该位置放置皇后正确的话,则到下一行
    {
     SetQueen(n+1);
    }
   }
}
}

int main(int argc, char argv[])
{
cout<<"请输入皇后的总数:"<<endl;
cin>>queen;
position = (int*)malloc(sizeof(int));
SetQueen();
cout<<"摆放完毕"<<endl;
cin.get();
cin.get();
return 0;
}

分享到:
评论

相关推荐

    C++递归实现八皇后问题

    八皇后问题是一个经典的问题,在棋盘上放置八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上。这个问题在计算机科学中常被用来教授和展示递归算法的原理与应用。在C++中,我们...

    n皇后问题回溯法C++代码

    **回溯法是一种在搜索解决问题时采用的有效算法,它通过试探性的从可能的解空间中逐步构造解,并在构造过程中不断回溯以...这种方法不仅可以解决N皇后问题,还可以扩展到其他类似的问题,如八数码难题、迷宫问题等。

    皇后问题 八皇后 C++

    总结来说,八皇后问题是一个展示回溯算法和逻辑思维能力的经典问题,通过C++编程实现,可以加深对算法理解,提高问题解决能力。无论是在学术研究还是在实际开发中,这类问题的解决方法都能为计算机科学家和工程师...

    C++基于回溯法解决八皇后问题示例

    本文实例讲述了C++基于回溯法解决八皇后问题的方法。分享给大家供大家参考,具体如下: 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的...

    回溯算法全代码

    3. **适用问题类型**:回溯算法适用于那些可以分解为一系列决策的问题,且每个决策都有有限个可能的选择,例如图的着色问题、旅行商问题、八皇后问题等。 二、具体应用实例 1. **01背包问题**:给定一组物品,每件...

    N皇后问题答案求解QT实现(带源码)

    八皇后问题(N=8)是最常见的版本,但通过修改源码中的N值和调整棋盘大小,可以扩展到更大的N皇后问题。 在QT新手的背景下,这个项目可能代码结构简单,注释清晰,适合学习者理解递归和回溯算法。通过这个项目,...

    C++ 回溯法解决作业分配问题

    回溯法是一种强大的搜索策略,常用于解决组合优化问题,如旅行商问题、八皇后问题等。在本案例中,我们将探讨如何使用C++通过回溯法来解决作业分配问题。作业分配问题是一个经典的组合优化问题,其目标是将一组作业...

    算法 C++算法 经典 基本算法

    5. **递归与回溯**:递归是函数调用自身的方式,常见于树遍历、八皇后问题等。回溯则是一种尝试所有可能解的策略,如N皇后问题、迷宫问题。 6. **贪心算法**:在每一步选择局部最优解,以期望得到全局最优解,如...

    满m叉树的算法以及皇后棋盘走法的算法实现

    八皇后问题和满m叉树的算法实现都需要对递归、回溯法、数据结构以及条件判断有深入理解。通过解决这些问题,可以提升编程技能,同时也能更好地理解如何在实际问题中应用算法。此外,这些算法在解决更复杂的问题时,...

    计算机算法分析与设计5-20部落卫队问题C++代码(回溯法解最大团)

    这种方法常用于解决约束满足问题和组合优化问题,如八皇后问题、旅行商问题等。 对于最大团问题,回溯法的基本思想可能是这样的: 1. **初始化**:从一个空的顶点集合开始,作为当前的候选团。 2. **选择**:选择...

    基于C++的五种算法实现

    它常用于解决组合优化问题,如八皇后问题、图的着色问题等。在C++中,回溯法通常配合递归使用,通过剪枝避免无效搜索,提高效率。 分支限界法(Branch and Bound,B&B)是回溯法的一种扩展,通过引入下界和上界概念...

    算法实验(c++实现).zip_wouldrrp_算法实验_编程实验和代码

    "回溯法.docx"可能包含八皇后问题、N皇后问题、图着色问题等实例。回溯法常用于解决约束满足问题和组合优化问题,其核心是剪枝操作,可以有效地减少搜索空间,提高算法效率。 这三个实验旨在帮助学习者深入理解并...

    c++经典算法代码和课件

    8. **回溯法**:用于解决约束满足问题,如八皇后问题、N皇后问题、数独等。 9. **排序算法的复杂度分析**:理解不同排序算法的时间复杂度和空间复杂度,有助于在实际应用中选择合适的算法。 10. **C++标准模板库...

    《数据结构——C++实现》(第二版)课本源代码

    《数据结构——C++实现》(第二版)是一本经典的计算机科学教材,专注于介绍各种数据结构及其在C++编程语言中的实现。这本书的核心是通过实际的代码示例帮助读者理解和掌握数据结构的基本概念,这对于任何想要深入...

    C经典算法程序 C++ C

    - 回溯法用于解决组合优化问题,如八皇后问题、N皇后问题。 - 贪心算法在每一步选择局部最优解,如霍夫曼编码。 8. **C++特有的算法和概念**: - 多态、继承、模板等面向对象特性,以及STL(标准模板库)中的...

    C C++算法实例(宝贵资源)

    7. **递推与回溯**:如八皇后问题、N皇后问题等,递推和回溯是解决约束满足问题的有效手段。 通过这份"C C++算法实例",学习者不仅可以学习到如何用C和C++语言实现各种算法,还能理解不同算法的原理和适用场景,...

    C++编写的分配任务问题

    这种策略特别适用于解决如迷宫问题、八皇后问题、图的着色问题等具有多解或无解的组合优化问题。 在分配任务问题中,我们可能面临的情况是:有一组任务需要分配给一组工人,每个任务有其特定的需求和限制,而每个...

    20151910042-刘鹏-20-综合训练 - 求皇后问题1

    实验报告涉及的知识点主要集中在解决著名的“八皇后问题”,这是一个经典的计算机科学问题,它与数学和算法紧密相关。八皇后问题是在一个8×8的棋盘上放置8个皇后,要求任何两个皇后不能处于同一行、同一列或同一对...

    棋盘覆盖问题(C++版)

    在八皇后问题的基础上,它探讨了如何有效地放置一定数量的棋子(通常为皇后)在棋盘上,使得任何两个棋子都不会在同一行、同一列或同一斜线上。这个问题在实际中有着广泛的应用,比如在资源分配、网络路由、任务调度...

    算法与数据结构之回溯法

    八皇后问题的推广,即n皇后问题,将问题扩展到了任意大小的棋盘,寻找放置n个皇后的方式。这个问题同样可以用回溯法解决,其解空间的复杂度随着棋盘大小的增加呈指数级增长。 回溯法不仅适用于解决棋盘类问题,还...

Global site tag (gtag.js) - Google Analytics