回溯法求解八皇后问题
2014-09-25 15:02
267 查看
首先我们来了解一下八皇后问题。
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n =
1或n ≥ 4时问题有解[1]。
下面三张图很清楚的展示了皇后的占位
那么 知道了问题,我们如何来求解此类问题?
首先我们从题意中能够得到的隐含条件就是每一个皇后占据一行(或是每一个皇后占据一列),这是一个非常重要的切入点,没有这个切入点的话,我们分析起来将会很麻烦。
其次既然我们每一行只能放置一个皇后,那么我就可以迭代的从第一行至最后一行开始逐行放置皇后,并且放置的过程中检测皇后的位置是否合理,如果不合理,那么我必须返回上一行重新选择其他位置(这就是我们所说的回溯问题,遇难则退),就是在这样的前进、探索、回溯的过程中,我们找出所有满足皇后合理位置的解。
下面给出C语言的实现
附上5个皇后的结果图
![](https://img-blog.csdn.net/20140925150834142?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ3poZW45Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
[1]:http://zh.wikipedia.org/wiki/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98
八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n =
1或n ≥ 4时问题有解[1]。
下面三张图很清楚的展示了皇后的占位
那么 知道了问题,我们如何来求解此类问题?
首先我们从题意中能够得到的隐含条件就是每一个皇后占据一行(或是每一个皇后占据一列),这是一个非常重要的切入点,没有这个切入点的话,我们分析起来将会很麻烦。
其次既然我们每一行只能放置一个皇后,那么我就可以迭代的从第一行至最后一行开始逐行放置皇后,并且放置的过程中检测皇后的位置是否合理,如果不合理,那么我必须返回上一行重新选择其他位置(这就是我们所说的回溯问题,遇难则退),就是在这样的前进、探索、回溯的过程中,我们找出所有满足皇后合理位置的解。
下面给出C语言的实现
#include <stdio.h> #include <math.h> const int MAX_QUEUE=5; //这里我使用的是5个皇后作为测试,大家可以自行修改选择, //这里行是确定的,因此我们只需要关注皇后所在的列值 int column[MAX_QUEUE]; //检测是否与其他皇后位置冲突 int place(int row) { if(row==0) return 1; int i; //判断是否在同一条对角线上以及是否在同一行、列 for(i=0;i<row;i++) { if(column[row]==column[i] || abs(column[i]-column[row])==row-i) return 0; } return 1; } void show() { for(int i=0;i<MAX_QUEUE;i++) printf("%d ",column[i]); printf("\n"); } // 选择皇后正确位置 // 回溯法,回溯标志-row,这个是非常重要的 void select(int row) { int i; for(i=0;i<MAX_QUEUE;i++) { column[row]=i; if(place(row)) { //当row是最后一行时并且能够放置,那么便是正确的 //打印之后,可以继续向后看看有没有其他摆放策略 if(row==MAX_QUEUE-1) show(); else select(row+1); } } } int main() { int i; select(0); return 0; }
附上5个皇后的结果图
[1]:http://zh.wikipedia.org/wiki/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98
相关文章推荐
- 回溯法求解八皇后问题
- C语言回溯法递归求解八皇后问题
- 用回溯法求解八皇后问题
- 回溯法求解八皇后问题
- 回溯法求解八皇后问题
- 以前的作业:八皇后问题求解
- 经典算法(1)——8皇后问题求解(回溯法)
- 递归-回溯法求解8皇后问题(C)
- “八皇后”问题递归法求解
- [导入]二维数组求解八皇后问题
- 回溯法解决N皇后问题——递归与非递归求解
- 回溯法求解和的问题
- 经典算法(1)——8皇后问题求解(回溯法)
- 0-1背包问题简单实例(回溯法求解…
- 局部搜索思想求解八皇后问题
- 0-1背包问题求解归纳(动态规划法,贪心算法,回溯法,分治法和分支界限法)__更新到完整
- 回溯法求解 “n 皇后 问题”——Java 实现
- 用回溯法求解跳马问题
- 八皇后问题求解----C++实现
- 用回溯法求解0—1背包问题,并输出问题的最优解