回溯算法解八皇后问题(java版)

标签: 8皇后问题java java解8皇后问题 回溯算法解8皇后
6524人阅读 评论(3) 收藏 举报
分类:

    八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单。

    下面用java版的回溯算法来解决八皇后问题。

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

     思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列。直到所有皇后都放完,或者放哪都不行。

    详细一点说,第一个皇后先放第一行第一列,然后第二个皇后放在第二行第一列、然后判断是否OK,然后第二列、第三列、依次把所有列都放完,找到一个合适,继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。然后回头继续第一个皇后放第二列,后面继续循环……

    好了,开始上代码。

package huisu;

/**
 * Created by wolf on 2016/3/16.
 */
public class WolfQueen {
    /**
     * 一共有多少个皇后(此时设置为8皇后在8X8棋盘,可以修改此值来设置N皇后问题)
     */
    int max = 8;
    /**
     * 该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列
     */
    int[] array = new int[max];

    public static void main(String[] args) {
        new WolfQueen().check(0);
    }

    /**
     * n代表当前是第几个皇后
     * @param n
     * 皇后n在array[n]列
     */
    private void check(int n) {
        //终止条件是最后一行已经摆完,由于每摆一步都会校验是否有冲突,所以只要最后一行摆完,说明已经得到了一个正确解
        if (n == max) {
            print();
            return;
        }
        //从第一列开始放值,然后判断是否和本行本列本斜线有冲突,如果OK,就进入下一行的逻辑
        for (int i = 0; i < max; i++) {
            array[n] = i;
            if (judge(n)) {
                check(n + 1);
            }
        }
    }

    private boolean judge(int n) {
        for (int i = 0; i < n; i++) {
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
                return false;
            }
        }
        return true;
    }

    private void print()  {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + 1 + " ");
        }
        System.out.println();
    }
}
    以上就是所有代码。逻辑还比较简单,逐行判断,依次遍历,直到找到该行合适列才进入下一行。


    

    


查看评论

数据结构(JAVA版)

必须熟悉JAVA语言,使用JAVA语言实现数据结构的链表,堆栈,队列,二叉树,排序,查找
  • 2016年07月08日 17:21

8皇后问题(java算法实现)

最近总是无法静下心来集中精神干一些该干的事情,百般空虚之下,总得找了点有意义的东西填充一下,找了一道很久以前就听说挺经典的算法基础题来研究,就是下面那道题了,有一句话不知道怎么说来着,检验知识掌握与否...
  • zhong317
  • zhong317
  • 2009-09-23 22:37:00
  • 33286

Java实现八皇后问题,用数组递归算法,简单易懂

八皇后问题要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击。即没有两个皇后是在同一行、同一列或者同一对角上。典型的八皇后问题,使用Java写的算法,算法虽比较简单,但难免会有新手会犯疏漏和错误,希望...
  • H_JinXian
  • H_JinXian
  • 2016-04-07 19:43:37
  • 4211

八皇后问题java代码

八皇后问题-回溯法
  • zpcandzhj
  • zpcandzhj
  • 2015-05-05 19:46:05
  • 1929

用回溯法解决八皇后问题(Java实现)

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

用Java解决八皇后问题

class Queen { static final int QUEEN_MAX = 8; // 皇后的数量 int[][] Queencount = new int[QUEEN_MAX][...
  • mw08091020
  • mw08091020
  • 2012-09-25 20:17:56
  • 6824

八皇后问题 回溯 非递归 java

1、八皇后问题 回溯 非递归的 java实现,注释写得详细了,最好还是自己先写写: import java.util.Scanner; public class Queen { private s...
  • tzh476
  • tzh476
  • 2016-11-02 02:49:41
  • 517

java利用递归解决八皇后问题

问题简介: 要求在一个8*8的棋盘上放置8个皇后,使任意两个皇后都不同行不同列且不在同一条斜对角线上。采用递归和回溯的思想解决这一问题是较为直观的。一开始,棋盘上的任意格子都可落子,因此可任意选择第...
  • yange1025
  • yange1025
  • 2016-04-30 00:06:37
  • 1151

Java基本功练习七(一维数组强化[豆机问题、八皇后问题])

通过有趣的例子,对一维数组的使用进行强化练习,是《Java基本功练习六》的延续。...
  • xyb890826
  • xyb890826
  • 2014-12-10 19:36:33
  • 1675

八皇后问题java实现

八皇后问题java实现 public class eightqueen { public static int count=0; public static void main(String[]...
  • sun11462
  • sun11462
  • 2015-08-20 11:20:25
  • 533
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 46万+
    积分: 5575
    排名: 5953
    博客专栏
    友情链接
    最新评论