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格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
随机推荐
- 关于cocostudio加载UI json CCUIHELPER未声明问题
查看官方的文档,在文档的最后添加了如何加载项目.如下代码: UILayer* ul =UILayer::create(); ul->addWidget(CCUIHELPER->create ...
- 【JavaScript】我的JavaScript技术总结第一篇——编程细节
遍历数组 for (var i=0, l=arr.length; i<l; i++) 这样写的一个好处就是让每次循环少一步获取数组对象长度的操作,数组长度越长,价值越明显. 判断变量的真假 if ...
- setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key delete.的问题
今天弄ios的sqlite数据库,程序写完后编译发现一个奇怪的问题,错误信息也不提示行号,只有如下信息: 一遍遍的查找代码也没有发现啥问题,后来在storyboard中找到了该错误的原因 原来是一个按 ...
- Android 设计模式之观察者模式(转载自:“http://blog.csdn.net/fangchongbory/article/details/7774044”)
/* * 观察者模式 * 定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的 * 对象都得到通知并被自动更新 * * 当然, ...
- Oracle数据库用户数据完整备份与恢复
使用PLSQL-Developer工具可以快速便捷地完成Oracle数据库用户.表的备份恢复. Oracle数据库用户数据完整备份与恢复 1. 备份 1.1 PL/SQL->工具->导 ...
- struts2常用的常量constant(转)
原文地址:http://blog.csdn.net/wfcaven/article/details/5937548 常用的常量配置 struts.serve.static.browserCache ...
- Python 函数的使用 外加引入文件
#coding=utf-8 #!user/bin/python import sys import test2 def functionsss(name,sex,age=25): print name ...
- angular自定义指令详解
指令(directive)是angular里面最核心也是最难懂的东西,在慕课网看了下大漠穷秋老湿的视频,自己百度半天做了一些小test,总算把一切都搞明白了. 先列出学习来源: 指令中controll ...
- 初涉JavaScript模式 (13) : 代码复用 【上】
引子 博客断了一段时间,不是不写,一是没时间,二是觉得自己沉淀不够,经过一段时间的学习和实战,今天来总结下一个老生常谈的东西: 代码复用. 为何复用 JS门槛低,故很多人以为写几个特效就会JS,其实真 ...
- java计算一个月有多少天和多少周
import java.util.Calendar; /** * 功能概述:计算指定年月的天数和周数<br> * 创建时间:2010-5-17 下午05:25:58<br> * ...