Java实现八皇后
实验题目 回溯法实现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实现八皇后的更多相关文章
- java实现八皇后问题(递归和循环两种方式)
循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVA ...
- 比赛组队问题 --- 递归解法 --- java代码 --- 八皇后问题
两队比赛,甲队为A.B.C3人,乙队为X.Y.Z3人.已知A不和X比,C不和X.Z比,请编程序找出3队赛手名单 采用了与八皇后问题相似的解法,代码如下: 如有疑问请链接八皇后问题的解法:http:// ...
- 八皇后问题java实现
八皇后问题java实现 public class eightqueen { public static int count=0; public static void main(String[] ar ...
- 使用java语言实现八皇后问题
八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 解: package eightQuen; / ...
- Java编程思想—八皇后问题(数组法、堆栈法)
Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...
- 算法学习 八皇后问题的递归实现 java版 回溯思想
1.问题描述 八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或 ...
- Java实现蓝桥杯 算法提高 八皇后 改
**算法提高 8皇后·改** 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋 ...
- 八皇后问题 --- 递归解法 --- java代码
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
随机推荐
- getconf 取系统配制 --CPU
cpu 缓存:getconf -a LEVEL1_ICACHE_SIZE LEVEL1_ICACHE_ASSOC LEVEL1_ICACHE_LINESIZE LEVEL1_DCACHE_SIZE L ...
- Android(java)学习笔记232:Android进程间通讯(IPC)之AIDL
一.IPC inter process communication 进程间通讯 二.AIDL android interface defination language 安卓接口定义语言 满 ...
- BestCoder冠军赛 - 1009 Exploration 【Tarjan+并查集缩点】
[题意] 给一个图,这个图中既有有向边,又有无向边,每条边只能走一次,问图中是否存在环. 最多10^6个点,10^6个无向边,10^6个有向边 [题解] 因为既有有向边又有无向边,所以不能单纯的用ta ...
- SSH常用命令选项
SSH 是什么 SSH(全称 Secure Shell)是一种加密的网络协议.使用该协议的数据将被加密,如果在传输中间数据泄漏,也可以确保没有人能读取出有用信息.要使用 SSH,目标机器应该安装 SS ...
- Overload和Override的区别?
Overload和Override的区别? Override是重写:方法名称.参数个数,类型,顺序,返回值类型都是必须和父类方法一致的.它的关系是父子关系Overload是重载:方法名称不变,其余的都 ...
- MD5加密相关
demo效果
- NHibernate执行原生带sum的sql
可以自行查出想要的字段,并且返回的是model类型,可以点出所有的字段. 但是select 后面的字段名 必须有xml的字段名一模一样. ISession iSession = null; strin ...
- 从头开始学c++,补基础,补踏实
在对c++一知半解的情况下,写c++程序是非常吃力的.对于半路出家写c++的我,写了几个颓废的程序后,再也没有勇气用现有的c++知识去写千疮百孔的程序.非常想写出<整洁的代码>中那样的代码 ...
- How to scroll the window using JQuery $.scrollTo() function
$('html, body').animate({scrollTop: $("#page").offset().top}, 2000); http://stackoverflow. ...
- 【转载】如何学习javascript
如何学习Javascript 作者: chaomao 首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我 ...