N皇后问题的实现
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皇后问题的实现的更多相关文章
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [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 ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- 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 ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
- 两个NOI题目的启迪8皇后和算24
论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...
随机推荐
- bzoj 1208
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 9775 Solved: 3918[Submit][Sta ...
- DBMS_RANDOM 用法
oracle中用于生成随机数的包:DBMS_RANDOM,这个包里面包含了很多方法,以下列出几个常用的方法 1.DBMS_RANDOM.RANDOM方法: FUNCTION random RETURN ...
- 转:SkipList跳表
http://kenby.iteye.com/blog/1187303 相关概念: 1.几何分布 http://baike.baidu.com/link?url=DdtNq6pCWIvr7onVBtE ...
- Matlab修改背景颜色
步骤: 1, 在matlab命令行中运行prefdir, 获取matlab.prf文件所在路径 2, 打开matlab.prf所在路径, 找到matlab.prf文件, 作备份 3, 将以下内容添加到 ...
- H5页面中唤起native app
现在各类app,分享出去的H5页面中,一般都会带着一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载.这是一个很正常的推广和导流量的策略,最近产品经理就提 ...
- 用pip install升级已安装的包的附加包, 以tabulate包为例
用pip install升级已安装的附加包, 以tabulate包为例 去pypi官网查看tabulate包的介绍, 发现tabulate 0.7.6才开始支持宽字符的美化打印. 而且还需要安装它的附 ...
- 【mybatis笔记】 resultType与resultMap的区别
序言: 昨天做一个项目,看到很多刚开始用mybatis的同事对于resultType和resultMap的理解与使用含糊不清,这里我试图用最好理解的说法写一写,欢迎大家勘误. 两者异同: 相同点:re ...
- [转载]bootstrap 2.3版与3.0版的使用区别
http://www.weste.net/2013/8-20/93261.html bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3. ...
- 【转】.NET中的三种Timer的区别和用法
最近正好做一个WEB中定期执行的程序,而.NET中有3个不同的定时器.所以正好研究研究.这3个定时器分别是: //1.实现按用户定义的时间间隔引发事件的计时器.此计时器最宜用于 Windows 窗体应 ...
- 【转】线程间操作无效: 从不是创建控件“textBox2” 的线程访问它。
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...