八皇后问题
Posted 月笙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题相关的知识,希望对你有一定的参考价值。
八皇后问题,是一个古老问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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种
回溯算法:回溯算法也叫试探法,通俗的将就是一个方向的路一直往前走,能走则走,不能走则退回来换一个方向再试。一般的实现步骤是:针对一个问题定义解的空间,至少包含问题的一个最优解;用易于搜索的解空间结构,使得能用回溯方法搜索整个解空间;以深度优先的方式搜索整个解空间,并在搜索过程中通过剪枝函数避免无效搜索。
以上是关于八皇后问题的主要内容,如果未能解决你的问题,请参考以下文章