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

八皇后问题

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

代码实现

static int count = 0;//记录有几种方法
int max = 8;//max表示几个皇后
int[] arr = new int[max];//用一个数组表示,其中arr[n]表示放在第arr[n]+1列,n表示第n+1个皇后,放在第n+1行
public static void main(String[] args) {
    EightQueen queen = new EightQueen();
    queen.store(0);
    System.out.printf("一共有%d种放置方法",count);
}

//在棋盘上放置第几个皇后
private void store(int n){
    if (n == 8){ //如果所有皇后放置完毕,则输出
        print();
        return;
    }
    for (int i = 0; i < max; i++) {
        arr[n] = i;
        if (Judg(n)){//判断是否与前面放置的有冲突
            store(n + 1);
        }
    }

}

private boolean Judg(int n){
    for (int i = 0; i < n; i++) {
        //arr[i] == arr[n] 表示是否在同一列
        //Math.abs(n - i) == Math.abs(arr[n] - arr[i]) 表示是否在同一斜线
        if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])){
            return false;
        }
    }
    return true;
}

//用于显示八皇后的位置
private void print(){
    count++;
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + 1 + " ");
    }
    System.out.println();
}

原文地址:https://www.cnblogs.com/z-tao/p/12521039.html

时间: 2024-11-05 16:21:23

八皇后问题求解java(回溯算法)的相关文章

【八皇后问题】 回溯算法

回溯算法:回溯算法实际上是一个类似枚举的搜索尝试方法,它的思想是在搜索尝试中寻找问题的解,当发现不满足求解条件时,就“回溯”返回,尝试别的路径.之前介绍的基础算法中的贪婪算法,动态规划等都具有“无后效性”,也就是在分段处理问题时,某状态一旦确定,将不再改变.而多数问题很难找到"无后效性”的阶段划分和相应决策,而是通过深入搜索尝试和回溯操作完成的. 八皇后问题:8*8的国际象棋棋盘中放八个皇后,是任意两个皇后不能互相吃掉.规则:皇后能吃掉同一行,同一列,同一对角线的任意棋子. 模型建立:不妨设八个

八皇后问题(回溯法&amp;枚举法)

作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表了出来! 首先.说明一下何为八皇后问题,我也不去谷歌了,直接简单的说明一下: 八皇后问题,就是在一个8*8的平面棋盘上,要求你摆放8个棋子,要求:这8个棋子不能有2个在同一行,也不能有2个在同一列,同时一条斜线上面也不能有2个~~~~ 比如:4*4的棋盘,你可以这样摆放(4皇后问题): 以上图为参照

八皇后(JAVA算法实现)

在学习现代软件工程构建之法这门课时,老师要求发表一篇博客,使用JAVA算法实现八皇后问题的求解.写这篇博客时,我学习了一些其他的博客,因为我常常遇到问题,自己无法解决时,向他人学习也是一种方法. 国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 我们可以逐行或者逐列来进行可行摆放方案的遍历,每一行(或列)遍历出一个符合条件的 位置,接着就到下一行或列遍历下一个棋子的合适位置,这

八皇后问题——递归+回溯法

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果. 求解过程: 采用遍历的办法,就是采用将每种情况都验证的办法最终找出问题的解,但是蛮力遍历的话,需要遍历的数据量太大,计算时间花费太大,所以在遍历

八皇后问题的回溯和递归方法

1.回溯法 用一维数组记录皇后的位置.数组的下标代表皇后所处的行,下标对应的值代表皇后所处的列.用count记录皇后的个数,当count小于queen数时,在循环体中寻找合适位置的queen.寻找queen:从列1依次寻找,满足条件则count+1,继续从列1处寻找下一个queen.如全部找完没找到合适的位置,则count-1,从第count个皇后所在列的下一位置开始继续循环. public class Queen { public void queenInstance(int num ) {

求解八皇后问题的退火算法

这个算法收敛速度还算满意.此算法可以计算n皇后问题,只需要将n改为相应整数即可! 主程序: clear; clc; %% %八皇后问题,8X8的棋盘上,放置8个皇后,使之两两都不能攻击 %使用退火算法计算 %初始的状态,随机在棋盘上放置8个皇后,每列放一个,使每一行都不能攻击 n = 8; %8皇后 %% %产生一个随机的状态 state = randperm(n); %% %计算当前状态的h函数值(与目标状态的差距,h越大,差距越大.h=0代表此状态即为目标状态) h = fun_c(stat

八皇后解法(回溯法)

package com.company; /** * Created by Administrator on 2016/9/15. */public class EigthQueue { private static int N = 8; private int count = 0; // 总方案数 private int[] flag = {-1, -1, -1, -1, -1, -1, -1, -1}; //回溯法递归实现八皇后问题 //输出棋盘 private void printChes

八皇后(dfs+回溯)

重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h>#define MAXN 8#define ll long longusing namespace std; ll ans=0;int c[MAXN]; void dfs(int cur){    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行    else    {       

八皇后问题——JAVA算法

public class Queen{ //同栏是否有皇后,1表示有 private int[] column; //右上至左下是否有皇后 private int[] rup; //左上至右下是否有皇后 private int[] lup; //解答 private int[] queen; //解答编号 private int num; public Queen(){ column=new int[8+1]; rup=new int[(2*8)+1]; lup=new int[(2*8)+1]