使用java语言实现八皇后问题
八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子。正确答案为92中,接下来用java语言实现。
解:
package eightQuen;
/**
* 八皇后问题
*
* @author 83771
*
*/
public class eight {
// 定义一个数组 表示棋盘
public static Integer[][] checkerBoard = new Integer[8][8];
// 棋盘副本
public static Integer[][] checkerBoardCopy = new Integer[8][8];
// 计数器 用于计数有多少种方法
public static Integer jishu = 1;
// 定义横竖斜方向上是否有棋子
public static boolean flag1 = true;
public static boolean flag2 = true;
public static boolean flag3 = true;
public static boolean flag4 = true;
// 初始化一个棋盘 8x8
public static void init() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(0 + " ");
checkerBoard[i][j] = 0;
}
System.out.println();
}
checkerBoardCopy = checkerBoard;
}
// 递归测试方法
public static void startTest(int row) {
for (int col = 0; col < 8; col++) {
if (checkCheet(row, col, checkerBoardCopy) == 1) {
if (row < 7) {
startTest(++row);
--row;
}
}
// 该行重新赋值为0 进行下一次判断
checkerBoardCopy[row][col] = 0;
}
}
// 检查是否危险
// row行
// col列
public static int checkCheet(int row, int col, Integer[][] checkerBoardCopy) {
flag1 = true;
flag2 = true;
flag3 = true;
flag4 = true;
// 行方向上是否满足条件
for (int i = 0; i < 8; i++) {
if (checkerBoardCopy[row][i] == 1) {
flag1 = false;
break;
}
}
// 列方向上是否满足条件
for (int j = 0; j < 8; j++) {
if (checkerBoardCopy[j][col] == 1) {
flag2 = false;
break;
}
}
// 右下方向
for (int i = row, j = col; i < 8 & j < 8; i++, j++) {
if (checkerBoardCopy[i][j] == 1) {
flag3 = false;
break;
}
}
// 左上方向
for (int i = row, j = col; i >= 0 & j >= 0; i--, j--) {
if (checkerBoardCopy[i][j] == 1) {
flag3 = false;
break;
}
}
// 左下方向
for (int i = row, j = col; i < 8 & j >= 0; i++, j--) {
if (checkerBoardCopy[i][j] == 1) {
flag4 = false;
break;
}
}
// 右上方向
for (int i = row, j = col; i >= 0 & j < 8; i--, j++) {
if (checkerBoardCopy[i][j] == 1) {
flag4 = false;
break;
}
}
if (flag1 & flag2 & flag3 & flag4) {
// 若为真 增此点的值赋为1
checkerBoardCopy[row][col] = 1;
// 如果已经判断到最后一行 并且最后一行也符合情况 打印整个棋盘
if (row == 7) {
printCheets(checkerBoardCopy);
}
return 1;
}
return 0;
}
// 打印棋盘方法
public static void printCheets(Integer[][] checkerBoardCopy) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(checkerBoardCopy[i][j] + " ");
}
System.out.println();
}
System.out.println("=================" + jishu++);
}
public static void main(String[] args) {
init();
startTest(0);
}
}
copy后可直接运行。 记一下这次的代码。
使用java语言实现八皇后问题的更多相关文章
- Java语言基础(八)
Java语言基础(八) 一.数学运算 + - * / % (1)凡是byte short char类型都按int类型的计算 看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...
- Java编程思想—八皇后问题(数组法、堆栈法)
Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...
- 回溯算法-C#语言解决八皇后问题的写法与优化
结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...
- C语言解决八皇后问题
#include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- R语言-八皇后问题
老师给我出了个暑期作业:用R语言解决八皇后问题. 八皇后问题:国际象棋棋盘(8×8)上放8个“后”,使8个“后”之间互相不能被进攻.(即:每个“后”所在行.列.两条斜线都没有其它子) 查看网上,大多用 ...
- 八皇后问题——列出所有的解,可推至N皇后
<数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...
- Python 八皇后问题
八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...
- 八皇后问题java实现
八皇后问题java实现 public class eightqueen { public static int count=0; public static void main(String[] ar ...
随机推荐
- .NET Core3.0 EF 连接 MySql
一:创建项目 添加 csproj (或者直接NuGet 引用) <ItemGroup> <PackageReference Include="Microsoft.Entit ...
- pandas的使用(3)
pandas的使用(3)
- centos7 openssh 7.9.1 升级
由于项目构建时间比较长,近期安全检查发现openssh有漏洞.所以要升级openssh到7.9p1版本.由于ssh用于远程连接,所以要谨慎操作. 1. 依赖安装 OpenSSL版本:目前OpenSSH ...
- nyoj 58-最少步数 (BFS)
58-最少步数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:17 submit:22 题目描述: 这有一个迷宫,有0~8行和0~8列: 1,1,1 ...
- nyoj 56-阶乘因式分解(一)(数学)
56-阶乘因式分解(一) 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:15 submit:16 题目描述: 给定两个数m,n,其中m是一个素数. ...
- nyoj 276-比较字母大小 (顺序比较, 逆序输出)
276-比较字母大小 内存限制:64MB 时间限制:3000ms 特判: No 通过数:13 提交数:15 难度:1 题目描述: 任意给出两个英文字母,比较它们的大小,规定26个英文字母A,B,C.. ...
- 【前端知识体系-CSS相关】CSS预处理器
1.常见的CSS预处理器有哪些? [!NOTE] css预处理器:用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就只要使用这种语言进行编码工作,可以让你的CS ...
- 力扣(LeetCode)验证回文串 个人题解
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, a plan, a c ...
- secureCRT安装与激活
SecureCRT安装及激活方式 百度网盘地址: SecureCRT及激活软件的地址: 1. 安装secureCRT 百度网盘下载,点击scrt814-x64.exe,按照提示安装secureCRT, ...
- PL真有意思(三):名字、作用域和约束
前言 这两篇写了词法分析和语法分析,比较偏向实践.这一篇来看一下语言设计里一个比较重要的部分:名字.在大部分语言里,名字就是标识符,如果从抽象层面来看名字就是对更低一级的内存之类的概念的一层抽象.但是 ...