如何基于java语言实现八皇后问题

这篇文章主要介绍了如何基于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后可直接运行。 记一下这次的代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中八种基本数据类型的默认值

    通过一段代码来测试一下 8种基本数据类型的默认值 package dierge; public class Ceshi { int a; double b; boolean c; char d; float f; byte e; long h; short j; public static void main(String args[]){ Ceshi a=new Ceshi(); System.out.println("整型的默认值是:"+a.a); System.out.print

  • MongoDB快速入门笔记(八)之MongoDB的java驱动操作代码讲解

    MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个). 下面代码给大家介绍MongoDB的java驱动操作,具体代码如下所示: import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.bson.Document; import com.mongodb.MongoClient; impo

  • 详解Java8新特性Stream之list转map及问题解决

    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap 具体用法实例如下: //声明一个List集合 List<Person> list = new ArrayList(); list.add(new Person("1001", "小A")); list.add(new Person("1002", "小B")); list.add(new Person

  • java实现八皇后问题示例分享

    问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行.同一列或者同一对角线上)如图所示   在本文中,对于两道题采用了稍微不同的解决方式,但都使用的是一维数组.6.20中,要求求出一种有效布局,我建立了一个 有八个元素的一位数组,通过随意打乱数组的值,通过值与下标的比较,直至得出一个有效布局:6.22中,要求求出所有有效布局,这里我使用了八进制数,遍历了  从001234567-076543210的所有数字,通过将其转化为八进制字符串,每位与其下标相比较,输出满

  • Java基础教程之八大基本数据类型

    前言 自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte, short, int, long, char, float, double, boolean. 其中: 整型:byte, short, int, long 字符型:char 浮点型:float, double 布尔型:boolean 在详细介绍之前,先科普一下,Java中最小的计算单元为字节,1字节=8位(bit). 一. 整型 Java中整型数据属于有符号数,即第一个bit位为0表示正整数,第一个bit位为1表

  • Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import java.util.Arrays; /* * 实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 * 以及快速排序.归并排序.堆排序和LST基数排序 * @author gkh178 */ public class EightAlgorithms { //插入排序:时间复杂度o(n^2) p

  • java八大经典书籍 你看过几本?

    java八大经典书籍,分享给大家. 一.Java从入门到精通 <Java从入门到精通(第3版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识. <Java从入门到精通(第3版)>编辑推荐:"软件开发视频大讲堂"丛书系清华社"视频大讲堂"重点大系之一.该大系包括多个子系列,每个子系列的图书在其同品种的图书中销售名列前茅, 二.Java核心技术(卷1):基础知识 Java领域最有影响力

  • Java函数式编程(八):字符串及方法引用

    第三章 字符串,比较器和过滤器 JDK引入的一些方法对写出函数式风格的代码很有帮助.JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说String,为了摆脱以前习惯的那种老的风格,我们得主动寻找机会来使用这些新的方法.同样,当我们需要用到只有一个方法的匿名内部类时,我们现在可以用lambda表达式来替换它了,不用再像原来那样写的那么繁琐了. 本章我们会使用lambda表达式和方法引用来遍历字符串,实现Comparator接口,查看目录中的文件,监视文件及目录的变更.上一章中介绍的一些方法还

  • 如何基于java语言实现八皇后问题

    这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子.正确答案为92中,接下来用java语言实现. 代码如下 package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 pu

  • C语言基于回溯算法解决八皇后问题的方法

    本文实例讲述了C语言基于回溯算法解决八皇后问题的方法.分享给大家供大家参考,具体如下: 问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例:在8X8格的国际象棋棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 问题求解: 采用回溯算法,即从第一行开始,依次探查可以放置皇后的位置,若找到,则放置皇后,开始探查下一行:若该行没有位置可以放置皇后,则回溯至上一行,清除该行放置皇后的信息,从该行原本放置皇后的下一个位置开始探查可

  • python基于右递归解决八皇后问题的方法

    本文实例讲述了python基于右递归解决八皇后问题的方法.分享给大家供大家参考.具体分析如下: 凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多. def Test(queen,n): '''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理''' q=queen[n] for i in xrange(n): if queen[i]==q or queen[i]-q==n-i or queen[i]-q==i

  • C++基于回溯法解决八皇后问题示例

    本文实例讲述了C++基于回溯法解决八皇后问题的方法.分享给大家供大家参考,具体如下: 回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法.这种方法适用于解一些组合数相当大的问题. 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解.如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯:否则,进入该子树,继续按深度优先策略搜索. 回溯法指导思想--走不通,就掉头.设计过程:确

  • 基于Java语言实现Socket通信的实例

    基于Java语言实现Socket通信 由于近日项目需求,需要在服务器中增加Socket通信的功能,接收硬件设备发送的心跳包和相关数据,因此又重新对Java的网络编程进行了复习,根据项目的实际情况做了简化的编程,实现了简单的通信过程. 1. Socket通信原理 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务. 以下是通过Socket套接字实现客户端与服务器端通信的示意图: 在实际应用中,客户端会通过访问服务器的IP和PORT连接到服务器端,这

  • 基于Java语言在窗体上实现飞机大战小游戏的完整步骤

    目录 小组项目 模块需求描述 总体开发思想 功能实现 1.登录与结束界面 2.播放音乐 3.子弹 运行测试 登陆界面 发射子弹 总结 小组项目 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程序后,出现一个窗体,在窗体上用鼠标控制英雄机的移动,通过子弹打击敌机进行分数的计算,以及英雄机血量的计算等. 主要模块:登陆界面.音乐.子弹.敌机.英雄机.背景图.结束界面.BOSS 机.分数计算.血量计算. 负责模块:登陆界面.音乐.子弹.结束界面. 模块需求描述 登陆界面:运行程序后,弹出

  • 基于Java语言的递归运算例题详解

    目录 一.实例演示:递归求N的阶乘 二. 递归调用练习 递归求1+2+3+……10的和 顺序打印一个数字的每一位 返回一个数组成本身的数字之和 求解汉诺塔问题 求斐波那契数列第N项 递归定义:一个方法在执行过程中调用自身, 就称为 "递归". 递归的必要条件: 1. 将原问题划分成其子问题,注意:子问题必须要与原问题的解法相同. 2. 递归出口. 一.实例演示:递归求N的阶乘 public class fac { public static int factorial(int x){

  • 基于java语言实现快递系统

    本文实例为大家分享了java语言实现快递系统的具体代码,供大家参考,具体内容如下 功能介绍: 1.角色切换(快递员和普通用户) 快递员:有存快递.删除快递.修改快递信息.查看所有快递的功能. 用户:有取快递的功能 2.快递信息必须要有公司名称,快递单号及取件码信息. 涉及知识点: 1.Java 基础语法2.Java 基础数据类型3.流程控制语句(if.switch.while.do while.for.break 与 continue)4.数组 分析 1.题目要求要有存快递的功能,所以在设计时必

  • 利用C语言解决八皇后问题以及解析

    前言 八皇后问题是一个古老而著名的问题.该问题是19世纪著名的数学家高斯1850年提出:在一个8*8国际象棋盘上,有8个皇后,每个皇后占一格:要求皇后之间不会出现相互"攻击"的现象,即不能有两个皇后处在同一行.同一列或同一对角线上.问共有多少种不同的方法? 回溯算法也叫试探法,它是一种搜索问题的解的方法.冋溯算法的基本思想是在一个包含所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树.算法搜索至解空间树的任意结点时,总是先判断该结点是否肯定不包含问题的解.如果肯定不包含,

  • 基于Java语言MD5加密Base64转换方法

    本文提供了基于MD5加密16位和32位的方法,具体内容如下 import java.io.IOException; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * <p>标题:编码工具类

随机推荐