实验题目   回溯法实现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. visul svn+花生壳

    1.服务器端 工具:visul svn+花生壳 花色壳:注册域名 visul svn:配置http://www.cnblogs.com/bluewelkin/p/3479105.html 外网访问,端 ...

  2. C++学习路线

    已经确定做C++后台的工作了,因此,要对C++要越来越熟悉才行,今天,在此列出学习和温习C++书籍的顺序,从而由浅入深地学习C++. 1. <C++ primer> 2. <Acce ...

  3. HDU 5037 Frog(贪心)

    题意比较难懂,一只青蛙过河,它最多一次跳L米,现在河中有石头,距离不等,上帝可以往里加石头,青蛙非常聪明,它一定会选择跳的次数最少的路径.问怎么添加石头能让青蛙最多的次数.输出青蛙跳的最多的次数. 考 ...

  4. Python之路,Day22 - 网站用户访问质量分析监测分析项目开发

    Python之路,Day22 - 网站用户访问质量分析监测分析项目开发   做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129  项目实战之 ...

  5. vijos P1375 大整数(高精不熟的一定要做!)

    /* 我尼玛这题不想说啥了 亏了高精写的熟..... 加减乘除max都写了 高精二分 */ #include<iostream> #include<cstdio> #inclu ...

  6. 1247 排排站 USACO(查分+hash)

    /* 暴力查分 n*n */ #include<cstdio> #include<cstring> #include<iostream> #define maxn ...

  7. 刚入门的easyui

    这两天看了下easyui的教学先说说自己的一些小小理解吧! ----在使用easyui中也遇到了一个问题 : Uncaught TypeError:cannot call method ‘offset ...

  8. mysql复习增删改查

    select * from torder where status='退款申请' UPDATE torder SET `status`='退款申请' WHERE status='等待付款' and i ...

  9. C# WebService 基础实例

    1.整个Demo结构:如下图: 2.新建项目--选择asp.net web服务应用程序TestWebService 3.重新命名Service1.asmx为MyService.asmx 4.右键MyS ...

  10. 为什么z-index不起作用

    感觉很简单的东西 在用的时候 可能会遇到这样活那样的问题 这就是要注意细节:参考地址:http://www.ourjour.com/136/ 设置z-index 不起作用,可能是这三个原因: 1.父标 ...