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

  解题思路:n*n的矩阵,递归每一个点,当皇后数量达到n的时候,进行判断,若满足题目条件,则答案加一(number++),否则继续进行遍历。

  保存皇后点的方法:构造一个二维数组reserve[][],当reserve[i][j] == 1时候,则该点已经有皇后,若reserve[i][j]==0则,皇后可以存在于该点,且该点置为一。

  判断皇后数量的方法,定义一个int sign ,当sign<8的时候递归遍历,并且重复上一操作,否则对reserve数组进行判断,判断此数组内等于1的点的坐标,是否满足题意,判断完之后,当前点置为0.

  判断x,y轴只需要判断是否有相等的坐标值即可。

  判断斜线,则判断每两个点之间坐标值相减的绝对值是否相等,(这里需要递归遍历每一个点)若相等,则点在斜线上重复,返回false,若不相等,则点在斜线上不重复,返回true。

  先定义全局变量:

private static int number = 0;  //表示答案数量
int count = 0; //下文的数组下标
static String[] str ; //保存正确答案的字符串数组,为了去除重复

  定义主函数:

public static void main(String[] args) {
com c = new com();
System.out.print("请输入皇后数字n:");
Scanner s = new Scanner(System.in);
int n = Integer.parseInt(s.nextLine());
int[][] reserve = new int[n][n]; //储存皇后的状态
str = new String[n*100];
int sign = 1;
c.startRun(reserve, n ,sign);
System.out.println(number);
}

  下面执行遍历操作的函数:

public void startRun(int[][] reserve , int n ,int sign){
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(reserve[i][j] == 0)
reserve[i][j] = 1; //该点为一个皇后
else{
continue;
}
if(sign == n){
if(checkAllQuean(reserve,n)){ //对n皇后进行位置判断
output(reserve,n); //一个输出函数,输出n皇后的点
System.out.println();
number++;
}
}else if(sign < n){
startRun(reserve , n ,sign + 1); //进行遍历操作
}
reserve[i][j] = 0;
}
}
}

  下面对数组reserve进行皇后位置判断:

/*
     * 检查两个皇后是否在同一行,同一列,或者同一斜线上
     * 存在返回false
     * 不存在返回true
     */
public boolean checkAllQuean(int[][] reserve , int n){
int[] x = new int[n];
int x1 = 0;
int[] y = new int[n];
int y1 = 0;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
if(reserve[i][j] == 1){
x[x1++] = i;
y[y1++] = j;
}
}
}// 获得所有皇后的点坐标
for(x1 = 0;x1 < n;x1++){
for(y1 = 0;y1 < n;y1++){
if(x1 == y1)
continue;
if(!checkTwoQuean(x[x1],y[x1],x[y1],y[y1])){ //比较每一次n皇后的点点点点坐标
return false;
}
}
}
if(!checkReNumber(x,y,n)){
return false;
}
return true;
}

  删除重复答案的函数:

/*
* 将确定的解答数组,保存在一个String[]里面,用来避免重复
* 若重复则返回false
* 不重复则返回true
*/
public boolean checkReNumber(int[] x,int [] y , int n){
String test = null ;
for(int j = 0; j < n;j++){
test += x[j]+""+y[j]+"";
}
for(String st : str){
if(st == null)
continue;
if(st.equals(test)){
return false;
}
}
str[count++] = test;
return true;
}

  下面进行对两个皇后位置的判断:

/*
* 检查两个皇后是否在同一行,同一列,或者同一斜线上
* 存在返回false
* 不存在返回true
*/
public boolean checkTwoQuean(int i , int j , int m ,int n){
if(i == m)
return false;
else if(j == n)
return false;
else if(Math.abs((m - i)) == Math.abs((n - j)))
return false;
else{
return true;
}
}

  下面是输出reserve点的函数:

public void output(int[][] reserve , int n){
for(int k = 0; k < n;k++){
for(int h = 0;h< n;h++){
if(reserve[k][h] == 0)
continue;
System.out.print(k+","+h+" ");
}
}
}

  完,但是效率极低,非常低。

输出案例:

请输入皇后数字n:4
0,1 1,3 2,0 3,2
0,2 1,0 2,3 3,1
2

  n皇后问题在大于等于4的时候有解

递归实现n(经典的8皇后问题)皇后的问题的更多相关文章

  1. 关于java的递归写法,经典的Fibonacci数的问题

    经典的Fibonacci数的问题 主要想展示一下迭代与递归,以及尾递归的三种写法,以及他们各自的时间性能. public class Fibonacci { /*迭代*/ public static ...

  2. 数据结构之递归Demo(走迷宫)(八皇后)(汉诺塔)

    递归 顾名思义,递归就是递归就是递归就是递归就是递归......就是递归 Google递归:

  3. 回溯经典(指定位置N皇后问题)

    N皇后问题自不必多说,这道题的先行条件是在放置的时候已经指定了一个棋子的位置. 输入第一行为N,第二行为指定棋子的坐标(x,y):输出方案总数以及按字典序升序的各种方案. 思路: 首先是回溯,其次对待 ...

  4. LeetCode N皇后 & N皇后 II

    题目链接:https://leetcode-cn.com/problems/n-queens/ 题目链接:https://leetcode-cn.com/problems/n-queens-ii/ 题 ...

  5. C#中八皇后问题的递归解法——N皇后

    百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections. ...

  6. Python递归的经典案例

    目录 : 一.递归的简介 二.递归的经典应用   2.1 递归求阶乘   2.2 递归推斐波那契数列   2.3 二分法找有序列表指定值   2.4 递归解汉诺塔 前言: 当我们碰到诸如需要求阶乘或斐 ...

  7. 算法学习->递归典例N皇后问题

    00 问题 在NN(这个N==N皇后的N)的方格棋盘上放置n个皇后,要求:1.每个皇后在不同行不同列:2.每个皇后在不同左右对角线 输出要求:输出符合条件的所有解,解以皇后的坐标的形式. 01 思路 ...

  8. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

  9. 个人项目Individual Project:n皇后问题

     源码的github链接: https://github.com/luhan420/test/tree/master 1.需求分析 在本次的课程设计中,用到的知识点主要有:类.函数.选择结构里的条件语 ...

  10. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

随机推荐

  1. .NetCore中的日志(2)集成第三方日志工具

    .NetCore中的日志(2)集成第三方日志工具 0x00 在.NetCore的Logging组件中集成NLog 上一篇讨论了.NetCore中日志框架的结构,这一篇讨论一下.NetCore的Logg ...

  2. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  3. jQuery学习之路(6)- 简单的表格应用

    ▓▓▓▓▓▓ 大致介绍 在CSS技术之前,网页的布局基本都是依靠表格制作,当有了CSS之后,表格就被很多设计师所抛弃,但是表格也有他的用武之地,比如数据列表,下面以表格中常见的几个应用来加深对jQue ...

  4. php实现的分页类

    php分页类文件: <?php /** file: page.class.php 完美分页类 Page */ class Page { private $total; //数据表中总记录数 pr ...

  5. nodejs操作arduino入门(javascript操作底层硬件)

    用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...

  6. Linux基础介绍【第二篇】

    远程连接Linux的原理 SHH远程连接介绍 当前,在几乎所有的互联网企业环境中,最常用的Linux提供远程连接服务的工具就是SSH软件,SSH分为SSH客户端和SSH服务端两部分.其中,SSH服务端 ...

  7. Ubuntu下开启php调试模式,显示报错信息

    在Ubuntu下php的缺省设置是不显示错误信息的,如果程序出错会显示“无法处理此请求的错误提示”,这在开发环境下非常不方便. 其实我们只要编辑下apache的配置文件就好 1.我的apache 配置 ...

  8. python之浅拷贝和深拷贝

    1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...

  9. AutoMapper(四)

    返回总目录 自定义值解析 虽然AutoMapper覆盖了相当一部分目标成员的映射场景,但是还有 1-5%的目标值需要解析处理一下.很多时候,自定义的值解析是可以放在领域层的领域逻辑.然而,如果该逻辑只 ...

  10. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...