码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2017-10-29 14:39:23      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:als   ++   sys   八皇后   turn   junit   java   pac   lag   

八皇后问题,是一个古老问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解。

下面是java实现代码

 1 package test;
 2 
 3 import org.junit.Test;
 4 
 5 /**
 6  * 八皇后问题,是一个古老问题,是回溯算法的典型案例。
 7  * 该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
 8  * 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
 9  * 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
10  * 八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n1×n1,而皇后个数也变成n2。而且仅当 n2 = 1 或 n1 ≥ 3 时问题有解。12  * 回溯算法:回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。
13  * 一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;
14  * 用易于搜索的解空间结构,使得能用回溯方法搜索整个解空间;以深度优先的方式搜索整个解空间,并在搜索过程中通过剪枝函数避免无效搜索。
15  */
16 public class EightQueens {
17     public int Queens(int[] col,int n,int row){
18         if(row==n)return 1;//当一开始行等于列时
19         int num = 0;
20         //从第一列开始循环列
21         for(int i = 0;i < n;i++){
22             col[row] = i;
23             boolean flag = false;
24             //从第一行开始循环行
25             for(int j = 0;j<row;j++){
26                 //判断是否冲突 同一列判断col[j]==col[row]  同一斜线判断 Math.abs(col[j]-col[row])==Math.abs(j-row)
27                 if(col[j]==col[row]||Math.abs(col[j]-col[row])==Math.abs(j-row)){
28                     flag=true;
29                 }
30             }
31             if(!flag){
32                 num+=Queens(col,n,row+1);
33             }
34         }
35         return num;
36     }
37     @Test
38     public void test(){
39         //8皇后问题
40         System.out.println(Queens(new int[8],8,0));;
41     }
42 }

输出结果是92种

回溯算法:回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;用易于搜索的解空间结构,使得能用回溯方法搜索整个解空间;以深度优先的方式搜索整个解空间,并在搜索过程中通过剪枝函数避免无效搜索。

 

八皇后问题

标签:als   ++   sys   八皇后   turn   junit   java   pac   lag   

原文地址:http://www.cnblogs.com/caopt/p/7749918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!