实验题目   回溯法实现8皇后问题

实验要求   a.掌握递归回溯算法的基本思想。

b.学习掌握应用面向对象通用回溯程序框架解决实际问题。  提高面向对象编程的技能。

作业描述:在8*8格的棋盘上放置彼此不受攻击的8个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。8后问题等价于在n*n格的棋盘上放置8个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。

package pku.java;

import java.util.ArrayList;
import java.util.List; public class Main {
private static int SIZE = 8;
private static int TotalNumber = 0;
private static List<boolean[][]> ChessBoards = new ArrayList<boolean[][]>(); public static void main(String[] args) {
boolean[][] chessboard = new boolean[SIZE][SIZE];
for (int i = 0; i < SIZE; ++i) {
for (int j = 0; j < SIZE; ++j) {
chessboard[i][j] = false;
}
}
Main Test = new Main();
Test.put(chessboard, 0);
Test.print(ChessBoards.get((int) (Math.random() * 1000)
% ChessBoards.size()));
System.out.println(TotalNumber);
} public void print(boolean[][] chessboard) {
for (int i = 0; i < SIZE; i++) {
for (int k = 0; k < SIZE; k++) {
if (chessboard[i][k] == true)
System.out.print("# ");
if (chessboard[i][k] == false)
System.out.print(". ");
}
System.out.println();
}
} public void put(boolean[][] chessboard, int level) {
// 放皇后
if (level == SIZE - 1) {
for (int j = 0; j < SIZE; j++) {
chessboard[level][j] = true;
if (safeJudge(chessboard, level, j)) {
// 放最后一个皇后
boolean[][] temp = new boolean[SIZE][SIZE];
for (int i = 0; i < SIZE; i++) {
for (int k = 0; k < SIZE; k++) {
temp[i][k] = chessboard[i][k];
}
}
ChessBoards.add(temp);
TotalNumber++;
}
chessboard[level][j] = false;
}
} else {
for (int j = 0; j < SIZE; j++) {
chessboard[level][j] = true;
if (safeJudge(chessboard, level, j)) {
put(chessboard, level + 1);
}
chessboard[level][j] = false;
}
}
} public boolean safeJudge(boolean[][] chessboard, int x, int y) {
// 放皇后时,判断放下是否安全,因为是逐行放,水平方向不会冲突
// int x_count = 0;
int y_count = 0;
// x-direction
// for (int j = 0; j < SIZE; j++) {
// if (chessboard[x][j] == true) {
// ++x_count;
// }
// if (x_count > 1)
// return false;
// }
// y-direction
for (int i = 0; i < SIZE; i++) {
if (chessboard[i][y] == true) {
++y_count;
}
if (y_count > 1)
return false;
}
// oblique-direction
// 主对角线
int z_count = 0;
for (int i = x, j = y; i >= 0 && j >= 0; --i, --j) {
if (chessboard[i][j] == true)
++z_count;
if (z_count > 1)
return false;
}
z_count = 0;
for (int i = x, j = y; i < SIZE && j < SIZE; ++i, ++j) {
if (chessboard[i][j] == true)
++z_count;
if (z_count > 1)
return false;
}
// 副对角线
int w_count = 0;
for (int i = x, j = y; i >= 0 && j < SIZE; --i, ++j) {
if (chessboard[i][j] == true)
++w_count;
if (w_count > 1)
return false;
}
w_count = 0;
for (int i = x, j = y; i < SIZE && j >= 0; ++i, --j) {
if (chessboard[i][j] == true)
++w_count;
if (w_count > 1)
return false;
}
return true;
}
}

Java实现八皇后的更多相关文章

  1. java实现八皇后问题(递归和循环两种方式)

    循环方式: package EightQueens;   public class EightQueensNotRecursive { private static final boolean AVA ...

  2. 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题

    两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...

  3. 八皇后问题java实现

    八皇后问题java实现 public class eightqueen { public static int count=0; public static void main(String[] ar ...

  4. 使用java语言实现八皇后问题

    八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; / ...

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

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

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

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

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

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

  8. 八皇后问题 --- 递归解法 --- java代码

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

  9. java递归求八皇后问题解法

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

随机推荐

  1. (转)cocos2dx 内存管理

    原文地址:http://blog.csdn.net/ring0hx/article/details/7946397 cocos2dx的内存管理移植自Objective-C, 对于没有接触过OC的C++ ...

  2. 多线程(NSThread、NSOperation、GCD)编程浅谈

    一.基本概念 进程:一个具有一定独立功能的程序关于某个数据集合的一次运行活动.可以理解成一个运行中的应用程序.线程:程序执行流的最小单元,线程是进程中的一个实体.同步:只能在当前线程按先后顺序依次执行 ...

  3. JDK5-枚举

    1. 使用普通类模拟枚举 public class Weekday { private Weekday() {} // 私有化 public static final Weekday MONDAY = ...

  4. 《Android开发艺术探索》读书笔记 (6) 第6章 Android的Drawable

    本节和<Android群英传>中的第六章Android绘图机制与处理技巧有关系,建议先阅读该章的总结 第6章 Android的Drawable 6.1 Drawable简介 (1)Andr ...

  5. Java基础知识强化之IO流笔记05:try...catch...finally包含的代码是运行期的

    1. 代码示例: 上面看到的第13行:  Date  d = null;(这里必须初始化) 第14~20行使用try...catch...finally包含代码,这里的代码已经变成运行期代码.此时我们 ...

  6. Android带参数链接请求服务器

    public void taste() { //设默认值 SharedPreferences.Editor editor = this.getSharedPreferences("setti ...

  7. Linux磁盘管理:LVM逻辑卷的创建及使用

    一.创建LVM逻辑卷 事先添加了三块虚拟物理磁盘/dev/sdb 1G, /dev/sdc 2G, /dev/sdd 3G 使用fdisk –l命令查看: [root@localhost ~]# fd ...

  8. lucene建立索引的过程

    建立索引过程 用户提交数据=>solr建立索引=>调用lucene包建立索引 官方建立索引和查询索引的例子如下: http://lucene.apache.org/core/4_10_3/ ...

  9. Web.Config文件中添加数据库配置文件

    1获取所有配置文件节点的类ConfigurationManager 2数据库节点<ConnectionStrings> <add> name ="Sqlconnect ...

  10. Mysql 列转行group_concat函数,与行转列

    1.正常情况. SELECT JoinEventIds from nt_mainnum 2.使用group_concat函数 select group_concat(JoinEventIds) fro ...