java N皇后实现问题解析

N皇后问题是一个典型的约束求解问题,利用递归机制,可以很快的得到结果。
N皇后问题的描述:
在一个n*n的棋盘上,摆放n个皇后,要求每个皇后所在行、列、以及两个对角线上不能出现其他的皇后,否则这些皇后之间将会相互攻击。如下图所示。

利用递归机制,可以很容易的求解n皇后问题。针对八皇后,总共有92种解。下面将给出N-皇后问题的一般求解代码,在这里代码是使用java编码的。
总共设计了三个类,一个是皇后类(Queen),一个棋盘类(Board),一个是求解主程序类(NQueens)。具体代码如下:


代码如下:

import java.util.ArrayList;
import java.util.List;
public class NQueens {
private int numSolutions;//求解结果数量
private int queenSize;//皇后的多少
private Board board;//棋盘
private List<Queen> queens = new ArrayList<Queen>();//皇后
//private List<Queen> nQueens = new ArrayList<Queen>();
public NQueens(){
}
public NQueens(int size){
numSolutions = 0;
queenSize = size;
board = new Board(queenSize);
for (int i = 0; i < queenSize; i++) {
Queen queen = new Queen();
queens.add(queen);
}
}
public void solve(){
System.out.println("Start solve....");
putQueen(0);
}
private void putQueen(int index){
int row = index;
//如果此列可用
for (int col = 0; col < board.getQueenSize(); col++) {
if (board.getLayout()[row][col] == 0) {
//将皇后的位置置为此列位置
queens.get(row).setPosition(col);
//然后将相应的位置(此列的正下方以及两个对角线)加1(即使其不可用)
for (int i = row + 1; i < board.getQueenSize(); i++) {
board.getLayout()[i][col] ++;
if (row + col - i >= 0) {
board.getLayout()[i][row + col - i] ++;
}
if (i + col - row < board.getQueenSize()) {
board.getLayout()[i][i + col - row] ++;
}
}
if (row == board.getQueenSize()-1) {
numSolutions++;
printSolution(numSolutions);
}else {
putQueen(row + 1);
}
//回溯,将相应的位置(此列的正下方以及两个对角线)减1
for (int i = row + 1; i < board.getQueenSize(); i++) {
board.getLayout()[i][col] --;
if (row + col - i >= 0) {
board.getLayout()[i][row + col - i] --;
}
if (i + col - row < board.getQueenSize()) {
board.getLayout()[i][i + col - row] --;
}
}
}
}
}
//打印求解结果
private void printSolution(int i){
System.out.println("The "+i+ " solution is:");
for (int j = 0; j < board.getQueenSize(); j++) {
for (int k = 0; k < board.getQueenSize(); k++) {
System.out.print(queens.get(j).getPosition() == k ? " * ":" - ");
}
System.out.println();
}
System.out.println();
}
/**
* @param args
*/
public static void main(String[] args) {
//可以改变参数
NQueens nQueens = new NQueens(8);
nQueens.solve();
}
}
import java.io.Serializable;
//皇后类
public class Queen implements Serializable, Cloneable {
/**
*
*/
private static final long serialVersionUID = 7354459222300557644L;
//皇后的位置
private int position;
public Queen(){
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
import java.io.Serializable;
//棋盘类
public class Board implements Serializable,Cloneable {
/**
*
*/
private static final long serialVersionUID = -2530321259544461828L;
//棋盘的大小
private int queenSize;
//棋盘的布局
private int[][] layout;
public Board(int size){
this.queenSize = size;
this.layout = new int[queenSize][queenSize];
//初始化,使棋盘所有位置都可用,即全部置为0
for (int i = 0; i < queenSize; i++) {
for (int j = 0; j < queenSize; j++) {
layout[i][j] = 0;
}
}
}
public int getQueenSize() {
return queenSize;
}
public void setQueenSize(int queenSize) {
this.queenSize = queenSize;
}
public int[][] getLayout() {
return layout;
}
public void setLayout(int[][] layout) {
this.layout = layout;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}

(0)

相关推荐

  • java N皇后实现问题解析

    N皇后问题是一个典型的约束求解问题,利用递归机制,可以很快的得到结果. N皇后问题的描述: 在一个n*n的棋盘上,摆放n个皇后,要求每个皇后所在行.列.以及两个对角线上不能出现其他的皇后,否则这些皇后之间将会相互攻击.如下图所示. 利用递归机制,可以很容易的求解n皇后问题.针对八皇后,总共有92种解.下面将给出N-皇后问题的一般求解代码,在这里代码是使用java编码的. 总共设计了三个类,一个是皇后类(Queen),一个棋盘类(Board),一个是求解主程序类(NQueens).具体代码如下:

  • Java使用Jdom读取xml解析实例

    本文实例讲述了Java使用Jdom读取xml解析.分享给大家供大家参考,具体如下: package com.yanek.demo.xml.test; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMExcep

  • Java Web开发入门书籍实例解析(总结一)

    从事Java Web开发这一段时间来,对Java 面向对象的思想和MVC开发模式可以说已经熟悉了.我当前参与的项目使用的框架是Spring.SpringMVC.Hibernate.下面我们小编给大家整理一篇教程帮助大家学习javaweb相关知识,感兴趣的朋友可以参考下. 一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 1.静态web资源(如html 页面):指w

  • Java线程安全基础概念解析

    Java线程安全初步了解.JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果.从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他额外的同步控制就可以安全放心的使用对象. 1.线程安全的定义 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安

  • Java数组越界问题实例解析

    Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化, 动态初始化:指定长度,由系统给出初始化值 静态初始化:给出初始化值,由系统给出长度 在我们使用数组时最容易出现的就是数组越界问题,好了,这里有个简单的例子 int [][] array = {{1,2,3},{1,4}}; System.out.println(array[1][2]); 这是一个二维数组,很明显,数组越界了,控制台中会打印如下信息: Exception in thread "main" java.l

  • 使用Java进行Json数据的解析(对象数组的相互嵌套)

    这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相关工具美化后的结果 { "translation": [ "爱" ], "basic": { "us-phonetic": "lʌv", "phonetic": "lʌv"

  • java的五种数据类型解析

    不知道大家对java的简单数据类型是否了解,下面针对Java的五种类型简单数据类型表示数字和字符,进行详细的讲解和分析. 一.简单数据类型初始化 在Java语言中,简单数据类型作为类的成员变量声明时自动初始化为默认值,除非显式地声明.简单数据类型为某一方法声明局部变量时不会自动地初始化而且会导致编译器扔出类似以下的错误消息"Variable x may not have been initialized.(x变量没有初始化)"表B定义了Java简单数据类型的默认值. 二.封装类 1av

  • java使用dom4j生成与解析xml文档的方法示例

    本文实例讲述了java使用dom4j生成与解析xml文档的方法.分享给大家供大家参考,具体如下: xml是一种新的数据格式,主要用于数据交换.我们所用的框架都有涉及到xml.因此解析或生成xml对程序员也是一个技术难点.这里就用dom4j来生成一个文档,需要注意的是每个xml文档只有一个根节点. package org.lxh; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutput

  • Java环境配置原理全面解析

    Java环境配置原理详解 1.Jdk安装目录文件说明: 一般jdk安装目录及路径 \Java\jdk1.7.0_79\lib,里面主要包含以下文件夹. bin:主要存放的是java工具中常用命令如:java,javac等. db:安装java db的路径. include:一些平台特病的头文件. jre:运行java程序所需的jre环境. lib:jdk工具命令的实际存放位置,如:bin中javac命令,实际是lib中tools.jar\sun\tools\javac中的Main.class文件

  • 使用递归算法结合数据库解析成Java树形结构的代码解析

    1.准备表结构及对应的表数据 a.表结构: create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父节点 ) b.表数据: insert into tb_tree (CID, CNAME, PID) values (1, '中国', 0); insert into tb_tree (CID, CNAME, PID) values (2, '北京市', 1); insert into tb_tree

随机推荐