问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在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. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  2. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  3. HTML5 sessionStorage会话存储

    sessionStorage 是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据.本篇主要介绍 sessionStorage(会话存储) ...

  4. J a v a 的“多重继承”

    接口只是比抽象类“更纯”的一种形式.它的用途并不止那些.由于接口根本没有具体的实施细节——也就是说,没有与存储空间与“接口”关联在一起——所以没有任何办法可以防止多个接口合并到一起.这一点是至关重要的 ...

  5. 从display:run-in;中学习新技能

    有时我们想在一行内显示一个标题,以及一段内容,虽然看起来比较简单,但是为了语义化用dl比较合适,但是它默认是block元素,改成inline?那么有多段呢?不就都跑上来了?用float?那问题也挺多. ...

  6. [数据结构]——链表(list)、队列(queue)和栈(stack)

    在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...

  7. Linux的学习笔记

    Linux,1991年,系统安全,良好的可移植性,多用户,多任务,良好的兼容性,良好的用户界面, 主流的是RedHat或者CentOS, CentOS 设置的网关 192.168.2.2 Window ...

  8. Struts2.5需要的最少jar文件

    以Struts2.5.2为例 从官网上下载“struts-2.5.2-min-lib.zip”,里面有7个jar文件: commons-fileupload-1.3.2.jarcommons-io-2 ...

  9. Linux测试环境搭建的学习建议

    随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起.这里介绍学习Linux测试环境搭建的一些建议. 一.Linux测试环境搭建从基 ...

  10. webService

    什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用.  1:从WebService的工作模式上 ...