N皇后问题是一个经典的问题,是回溯算法的典型案例。它是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的八皇后问题延伸而来的,具体要求如下:在N*N的方格棋盘放置N个皇后,使她们彼此不相互攻击,即任意2个皇后不允许在同一行、同一列、同一45°的斜线上,问有多少种摆法。

Java:

 import java.util.Scanner;  

 /**
* n皇后问题解决
*
*/
public class N_Queens {
/**下标i表示第几行,x[i]表示第i行皇后的位置,注意此处0行不用*/
public int[] x;
/**皇后的数目*/
public int queenNum;
/**解的数目*/
public int methodNum; N_Queens(int queenNum)
{
this.queenNum = queenNum;
this.x = new int[queenNum+1];//注意,这里我们从第1行开始算起,第0行不用
backtrack(1);//从第一个皇后开始递归
} /**
* 一行一行的确定该行的皇后位置
* @param t
*/
public void backtrack(int t)
{
if( t > queenNum) //如果当前行大于皇后数目,表示找到解了
{
methodNum++;//sum为所有的可行的解
//依次打印本次解皇后的位置
for(int m = 1; m <= queenNum; m++)
{
//System.out.println(x[m]);//这一行用输出当递归到叶节点的时候,一个可行解
//这里只是为了好看才写成下面的
for(int k =1; k <= queenNum;k++)
{
if(k == x[m])
{
System.out.print(x[m]+" ");
}
else
{
System.out.print("* ");//用*表示没有被用到的位置
}
}
System.out.println();
}
System.out.println();
}
else
{
for(int i = 1;i <= queenNum;i++)
{
x[t] = i;//第t行上皇后的位置只能是1-queenNum
if(place(t)) //此处的place函数用来进行我们上面所说的条件的判断,如果成立,进入下一级递归,即放置下一个皇后
backtrack(t+1);
}
}
} /**
* 判断第k行皇后可以放置的位置
* @param k k表示第k行,X[K]k表示第k行上皇后的位置
* @return boolean false表示此处不能放置皇后
*/
public boolean place(int k)
{
for (int j = 1; j < k; j++)
// 如果当前传入的第K行上的皇后放置的位置和其它皇后一个对角线(abs(x[k]- x[j])==abs(k-j)或一个直线上(x[j] == x[k])
if (Math.abs(x[k] - x[j]) == Math.abs(k - j) || (x[j] == x[k]))
return false;
return true;
} public static void main(String[] args)
{
System.out.print("请输入皇后数:");
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
System.out.println("\n棋盘布置方案:");
N_Queens n_queens = new N_Queens(n);
scan.close();
System.out.print("总共解数为:"+ n_queens.methodNum);
}
}

作者:耑新新,发布于  博客园

转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

N皇后问题的实现的更多相关文章

  1. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  2. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  3. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  4. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  5. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  6. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  7. N皇后问题

    题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...

  8. LeetCode:N-Queens I II(n皇后问题)

    N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...

  9. 八皇后问题_Qt_界面程序实现

    //核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...

  10. 两个NOI题目的启迪8皇后和算24

    论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...

随机推荐

  1. Python【time】模块

    import timeprint(type(11.234))print("输出结果为时间戳,float类型:",time.time())print("输出结果为本地时间元 ...

  2. element ui 栅格布局

    <el-row> <el-col :span="24"><div class="grid-content bg-purple-dark&qu ...

  3. [SDOI2016 Round1] 数字配对

    COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★   输入文件:m ...

  4. C#_事件学习

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. 记录第一次阿里云服务器部署java web工程的经历

    起因:测试一个微信小程序,发现所有的请求要求为https的形式,开发工具忽略后手机无法测试,故尝试配置. 准备:阿里云服务器一台 域名一个(解析在服务器)     tomcat7.0.54     j ...

  6. 【转载】 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1

    版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址http://blog.csdn.net/longxinchen_ml/article/details/51567960  目录(?)[- ...

  7. css 系统自学笔记2017-12-04

    一.几个常用的可以连写的样式属性 1.backgroud: 背景连写:没有先后顺序,都是可选的. 2.font字体属性连写: font: 二.元素分类 块级元素:div p h1~h6 ul li o ...

  8. [转载]内存的一些magic number和debug crt

    原文:http://www.360doc.com/content/13/0105/17/6295074_258392439.shtml 调试过debug版本的vc程序的人一定对0xCCCCCCCC和0 ...

  9. 【转】.NET+AE开发中常见几种非托管对象的释放

    尝试读取或写入受保护的内存.这通常指示其他内存已损坏. 今天在开发时遇到一个问题:" 未处理 System.AccessViolationException Message="尝试 ...

  10. phpcms数据结构

    v9_admin 管理员表 v9_admin_panel 快捷面板 v9_admin_role 角色表 v9_admin_role_priv 管理员权限表 v9_announce 公告表 v9_att ...