java N皇后实现问题解析

2016-02-19 11:36 33 1 收藏

下面,图老师小编带您去了解一下java N皇后实现问题解析,生活就是不断的发现新事物,get新技能~

【 tulaoshi.com - 编程语言 】

N皇后问题是一个典型的约束求解问题,利用递归机制,可以很快的得到结果。
N皇后问题的描述:
在一个n*n的棋盘上,摆放n个皇后,要求每个皇后所在行、列、以及两个对角线上不能出现其他的皇后,否则这些皇后之间将会相互攻击。如下图所示。
image
利用递归机制,可以很容易的求解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 ListQueen queens = new ArrayListQueen();//皇后
//private ListQueen nQueens = new ArrayListQueen();
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();
}
}

来源:https://www.tulaoshi.com/n/20160219/1597984.html

延伸阅读
标签: 游戏动漫
《命运》新手关于RAID常见问题解析 1 关于奖励 一周是一次, 周二下午5点(北京时间)刷新。首先,如果你先打完了30级HARD模式的话, 26级的也可以一起拿。如果你先打完了26级NORMAL模式的话,再打30级的,还有一部分奖励可以拿。这个跟周常 日常一样 2 特殊地 如果你本周二下午4点开始推BOSS, 假设你是推BOSS 在5点半推下去,那么 这个奖...
漂亮好看的操作系统始终不是我们的目的. 希望这篇文字能帮助至少一两个朋友从这个 Linux 的中文美化问题里面彻底解脱出来, 而真正投入到利用 Linux 为我们服务, 利用 Linux 进行开发工作的实质性事情当中. 以下内容包括: 1. 为 Redhat 的两个字体子系统添加字体 2. 让 Enlightenment 显示中文 3. Java 的中文问题: ...
标签: 游戏动漫
《巫师3 狂猎》巨人洞问题解析攻略 最近一直有玩家反映在玩《巫师3:狂猎》的时候,巨人洞没有办法进去,这是什么原因呢?该怎么解决呢,下面让图老师图老师小编为大家带来巨人洞问题解析攻略。 《巫师3:狂猎》巨人洞问题描述: 在山顶上那个全是尸体的房子,只显示巨人脚印,不显示人类的脚印。然后我根据网上的说法,沿着没有红色标...
《方舟 生存进化》孵化系统常见问题解析 《方舟:生存进化》中很多玩家对于孵化系统不太了解,目前玩家对于部分玩家常见问题作出了一些原因解释,下面一起来看看吧。 ​目前更新以后,把两头龙放尽量靠近,放建筑物卡住,按e设置enable wandering,母龙会有进度条,几分钟就会生蛋,生完有冷却时间,一两个小时以后生下一个。现在...
《坎巴拉太空计划》游戏常见问题解析 在《坎巴拉太空计划》这款游戏中,玩家想要火箭能够顺利升空,进入预行轨道是需要运用一些物理知识,有时候如果飞船速度或者燃料不够,容易造成上不了天,或者是解体等情况发生。 常见问题解析 关于火箭上不了天的问题 是不是用液体燃料按了空格没反应?但是以前用固体一按就上去了?使用液体...

经验教程

878

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部