import java.util.Date;

public class EightQueen

{
 public static void main(String[] args)

{
  long start = new Date().getTime();
  System.out.println("起始时间:[" + start + "]");  
  
  EightQueen Q = new EightQueen();
  Q.putQueen(0);
  
  long end = new Date().getTime();
  System.out.println("截止时间:[" + end + "]");
  System.out.println("共耗时:[" + (end - start) + "]毫秒");

}

static final int QUEEN_MAX = 8; // 皇后的数量

int[][] Queencount = new int[QUEEN_MAX][QUEEN_MAX];// 分配8X8的数组,充当棋盘,存放皇后

int resultCount = 0;// 记录皇后的放置方法的总数

int[] Queenplace = new int[QUEEN_MAX];// 存放每行的皇后位置即第column行的皇后放置位置是Queenplace[column]

public void putQueen(int Rows)

{

int row = Rows;// 行标

for (int column = 0; column < QUEEN_MAX; column++)// column表示列标

{

if (Queencount[row][column] == 0)// row行、column列可以放皇后

{

for (int rowi = row + 1; rowi < QUEEN_MAX; rowi++)// for循环的作用是使其斜下方和正下方不为0

{

Queencount[rowi][column]++;//正下方不为零

if (column - rowi + row >= 0)//左斜下方不为零

{

Queencount[rowi][column - rowi + row]++;

}

if (column + rowi - row < QUEEN_MAX)//右斜下方不为零

{

Queencount[rowi][column + rowi - row]++;

}

} //

Queenplace[row] = column;// row行column列放了皇后
    
    if (row == QUEEN_MAX - 1)// 皇后已放满,打印出皇后布局

{

printQueen(++resultCount);
    }

else // 否则继续排列下一行皇后

{

putQueen(row + 1);//递归调用

}

for (int rows = row + 1; rows < QUEEN_MAX; rows++)// 回溯,在此行的皇后不放此列column
                 // ,恢复该位置的正下面/斜下面的count

{

Queencount[rows][column]--;

if (column - rows + row >= 0)

{

Queencount[rows][column - rows + row]--;

}

if (column + rows - row < QUEEN_MAX)

{

Queencount[rows][column + rows - row]--;

}

}

}
  }

if (row == 0)

{

System.out.println(QUEEN_MAX + "皇后问题共有" + resultCount + "个解.");

}

}

public void printQueen(int size)// 打印皇后布局

{

System.out.println(QUEEN_MAX + "皇后的第" + size + "个解是:");

System.out.println();

for (int row = 0; row < QUEEN_MAX; row++)

{

for (int column = 0; column < QUEEN_MAX; column++)

{

System.out.print(Queenplace[row] == column ? " * " : " - ");

}

System.out.println();

}

System.out.println();

}

}

八皇后java算法的更多相关文章

  1. 八皇后—Java

    package queen; public class queen { static boolean col[] = new boolean[8]; static boolean main_diago ...

  2. Java实现蓝桥杯 算法提高 八皇后 改

    **算法提高 8皇后·改** 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋 ...

  3. 算法学习 八皇后问题的递归实现 java版 回溯思想

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

  4. 八皇后问题求解java(回溯算法)

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

  5. 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯

    什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...

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

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

  7. Java编程思想—八皇后问题(数组法、堆栈法)

    Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...

  8. 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介

    一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...

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

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

随机推荐

  1. angularJS 学习之路

    AngularJS 通过 ng-directives 扩展了 HTML. ng-app 指令定义一个 AngularJS 应用程序.也就是angularjs作用的入口  作用在什么标签或者整个body ...

  2. [SoapUI] 在SoapUI里用Java语言判断Excel单元格为空或者Null时出错

    我取Excel数据时先判断cell是否为"": if(cellValue != ""){     listNumber.add(i);     cellValu ...

  3. viewPager 的可滑动 Title

    有三种方式: 1. 系统提供的title 缺点:标题在viewpager的滑动过程中也会滑动 实现:在ViewPager布局中添加 PagerTabStrip 或者是 PagerTitleStrip ...

  4. ios中的http:get,post,同步,异步

    一.服务端 1.主要结构:

  5. Inverted sentences

    And ever has it been that love knows not its own depth until the hour of separation.  除非临到了别离的时候,爱永远 ...

  6. Android开发之JavaMail发送邮件(用户反馈)

    给APP增加了一个用户反馈的小功能,由于懒的搭服务器,所以就用邮件的形式进行通信,有如下两种方式: 1.使用调用手机上的其他程序完成邮件发送 2.使用javamail进行邮件发送 这里果断使用java ...

  7. comparator接口与compare方法的实现

    刷leetcodecode时看到一道题需要利用自定义的比较器进行排序,最开始一头雾水,看了API终于懂了~ Arrays.sort(T[] a,Comparator<? super T>  ...

  8. Linux 系统把英文修改成中文界面

    1.一般安装后的linux系统都是英文的界面,网上查了一下各种说法都有,我只做了如下的配置就好了,下载个中文包,改一下i18n就完事了,并没有那么复杂 下面上图文: 目前是英文的界面 2.下载个中文包 ...

  9. npm config

    在公司为了不再用 npm --registry=http://r.cnpmjs.org install -(g) xxx 就设置了内部的镜像文件地址为默认的代理地址 npm config set re ...

  10. 在windows不能正常使用boost og

    现象: 1. 在两个不同的dll中使用static的boost.log.在一个dll中的设置在另一个dll中没有起作用 原因:core::get()返回的是一个单例.在不同的dll中是不同的对象 解决 ...