八皇后问题,在一个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语言实现八皇后问题的更多相关文章

  1. Java语言基础(八)

    Java语言基础(八) 一.数学运算  + - * /  % (1)凡是byte  short  char类型都按int类型的计算   看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...

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

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

  3. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  4. C语言解决八皇后问题

    #include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...

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

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

  6. R语言-八皇后问题

    老师给我出了个暑期作业:用R语言解决八皇后问题. 八皇后问题:国际象棋棋盘(8×8)上放8个“后”,使8个“后”之间互相不能被进攻.(即:每个“后”所在行.列.两条斜线都没有其它子) 查看网上,大多用 ...

  7. 八皇后问题——列出所有的解,可推至N皇后

    <数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...

  8. Python 八皇后问题

    八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...

  9. 八皇后问题java实现

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

随机推荐

  1. 轻松实现C/C++各种常见进制相互转换

    其它进制转为十进制 在实现这个需求之前,先简单介绍一个c标准库中的一个函数: long strtol( const char *str, char **str_end, int base); 参数详细 ...

  2. 领扣(LeetCode)各位相加 个人题解

    给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所 ...

  3. python:timeit模块

    (鱼c)timeit模块详解——准确测量小段代码的执行时间 http://bbs.fishc.com/forum.php?mod=viewthread&tid=55593&extra= ...

  4. 《算法导论中文版》PDF 下载

    电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍 在有关算法的书中,有一些叙述非常严谨,但不够全面:另一些涉及了大量的题材,但又缺乏严谨性.本书将严谨性和全面性融为 ...

  5. 读懂JWT的使用,你就会用PHP如何实现了

    要如何用php实现JWT认证,那我们首先就来认识一下什么是JWT.什么是JWTJWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.JWT的声明一般被 ...

  6. toString() 方法的参数

    除开null 和 undefined之外所有的数据类型都是拥有toString方法的. 通常情况下我们使用toString()方法的时候都是不用传递参数的,但是Number类型的toString方法是 ...

  7. 盒模型 | CSS权重 | CSS层叠

    span{ color:red;} *{ font-family:"楷体";line-height:2em; font-size:18px;} 盒模型 CSS定义所有的元素都可能拥 ...

  8. centos7.6安装python3.7

    1.安装python3.7后,需要: yum install libffi-devel -y 然后再到python源码目录再make install 重新编译一下. 否则pip安装一些包时会安装不上, ...

  9. zsh: /usr/local/bin/pod: bad interpreter: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: no such file or directory

    系统升级为 macOS Catalina 发现 CocoaPods 不管用了. 解决方法: 打开 iTerm2 sudo gem update --system 输入电脑密码,然后 sudo gem ...

  10. AQS系列(一)- ReentrantLock的加锁

    前言 AQS即AbstractQueuedSynchronizer,是JUC包中的一个核心抽象类,JUC包中的绝大多数功能都是直接或间接通过它来实现的.本文是AQS系列的第一篇,后面会持续更新多篇,争 ...