什么是八皇后问题?

news/2024/7/15 18:10:35 标签: 图论, 递归算法

八皇后问题:
在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

思路分析:

  1. 每次放一行,从第1行开始。
  2. 每进入新的一行就从第1列开始
  3. 判断是否符合规则。
  4. 如果符合规则就进去下一行。
  5. 不符合规则就放在下一列。
  6. 如果将当前行的所有列放完都没有找到匹配规则的地方,就返回上一行的位置。
  7. 返回上一行的位置之后,将棋子继续往后面移动。从思路的第三点进行。
  8. 如果棋子将8行全部放完,返回第7行,将当前的棋子往下一列移动。判断,从思路三开始。

这样就会遍历所有的棋子

比如说当第一行棋子放在第一列时。

0 4 7 5 2 6 1 3 
0 5 7 2 6 3 1 4 
0 6 3 5 7 1 4 2 
0 6 4 7 1 3 5 2 

  1. 进入第二行,第一列不符合,匹配下一列,知道第5列符合规则,就进去第三行。
  2. 第三行,从第一列开始知道第8列符合,进去第四列
  3. 第四行,知道第6列符合,进入下一列。
  4. ······
  5. 第八行,第4列符合规则,此时8行全部放完了,返回第七列。
  6. 第七列刚才放在了第二列,此时往后移一列,放在第3列,看是否符合,一直到第8列都不符合,返回第六列。
  7. 第六列也没有符合的,继续返回上一行
  8. ······
  9. 当返回第二行的时候,上次在第5列,往后移,也就是第6列,判断符合规则,进去第三列,继续判断。
    10.直到第一行后面的遍历完,返回第一行,将第一行的位置移到第二列,继续判断。

我们这里用一个一维数组arr【8】 来存储
数组的索引代表行,元素代表列。

代码:

package recursion.queen8;



public class Queen {
    public static void main(String[] args) {
        Queen game = new Queen();
        game.check(0);
        System.out.println(count);
    }

    private static int count;

    //代表最大的行数和列数
    private final int MAX = 8;
    //用index代表行数,数组中的值代表列数
    private int[] arr = new int[MAX];
    public Queen() {
    }

    //用来放置棋子
    //n代表放置的式第几行

    public void check(int n){
        //如果n=8,说明前8行已经放好了,就输出并退出
        if (n==8){
            show();
            return;
        }
        //从第一列一直放到最后一列,进行一个遍历
        for (int i =0 ;i < MAX;i++){
            //arr[n]=i;代表的的就是n*i这和位置有棋子 在第n行把棋子放在第i列
            arr[n]=i;
            //判断放在第n行的棋子是否符合规范
            if (rule(n)){
                //如果符合规范就放下一行。
                check(n+1);
            }
        }
    }


    //用来检查所放置的棋子是否符合规则

    //n代表的式现在为现在判断的式第n行的棋子
    public boolean rule(int n){

        //i 代表的n之前的行数
        for (int i =0 ; i < n;i++){
            //arr[i]==arr[n]看前几行是否和现在放的棋子在同一列,Math.abs(n-i)==Math.abs(arr[i]-arr[n]))判断是否在斜线上,列数相差的绝对值和行数相差的绝对值作比较
            if (arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[i]-arr[n])){
                return false;
            }
        }

        return true;

    }
    //用来输出结果
    public void show() {

        for (int i = 0; i < MAX; i++) {
            System.out.print(arr[i] + " ");
        }
        count++;
        System.out.println();
    }

}

结果:

0 4 7 5 2 6 1 3 
0 5 7 2 6 3 1 4 
0 6 3 5 7 1 4 2 
0 6 4 7 1 3 5 2 
1 3 5 7 2 0 6 4 
1 4 6 0 2 7 5 3 
1 4 6 3 0 7 5 2 
1 5 0 6 3 7 2 4 
1 5 7 2 0 3 6 4 
1 6 2 5 7 4 0 3 
1 6 4 7 0 3 5 2 
1 7 5 0 2 4 6 3 
2 0 6 4 7 1 3 5 
2 4 1 7 0 6 3 5 
2 4 1 7 5 3 6 0 
2 4 6 0 3 1 7 5 
2 4 7 3 0 6 1 5 
2 5 1 4 7 0 6 3 
2 5 1 6 0 3 7 4 
2 5 1 6 4 0 7 3 
2 5 3 0 7 4 6 1 
2 5 3 1 7 4 6 0 
2 5 7 0 3 6 4 1 
2 5 7 0 4 6 1 3 
2 5 7 1 3 0 6 4 
2 6 1 7 4 0 3 5 
2 6 1 7 5 3 0 4 
2 7 3 6 0 5 1 4 
3 0 4 7 1 6 2 5 
3 0 4 7 5 2 6 1 
3 1 4 7 5 0 2 6 
3 1 6 2 5 7 0 4 
3 1 6 2 5 7 4 0 
3 1 6 4 0 7 5 2 
3 1 7 4 6 0 2 5 
3 1 7 5 0 2 4 6 
3 5 0 4 1 7 2 6 
3 5 7 1 6 0 2 4 
3 5 7 2 0 6 4 1 
3 6 0 7 4 1 5 2 
3 6 2 7 1 4 0 5 
3 6 4 1 5 0 2 7 
3 6 4 2 0 5 7 1 
3 7 0 2 5 1 6 4 
3 7 0 4 6 1 5 2 
3 7 4 2 0 6 1 5 
4 0 3 5 7 1 6 2 
4 0 7 3 1 6 2 5 
4 0 7 5 2 6 1 3 
4 1 3 5 7 2 0 6 
4 1 3 6 2 7 5 0 
4 1 5 0 6 3 7 2 
4 1 7 0 3 6 2 5 
4 2 0 5 7 1 3 6 
4 2 0 6 1 7 5 3 
4 2 7 3 6 0 5 1 
4 6 0 2 7 5 3 1 
4 6 0 3 1 7 5 2 
4 6 1 3 7 0 2 5 
4 6 1 5 2 0 3 7 
4 6 1 5 2 0 7 3 
4 6 3 0 2 7 5 1 
4 7 3 0 2 5 1 6 
4 7 3 0 6 1 5 2 
5 0 4 1 7 2 6 3 
5 1 6 0 2 4 7 3 
5 1 6 0 3 7 4 2 
5 2 0 6 4 7 1 3 
5 2 0 7 3 1 6 4 
5 2 0 7 4 1 3 6 
5 2 4 6 0 3 1 7 
5 2 4 7 0 3 1 6 
5 2 6 1 3 7 0 4 
5 2 6 1 7 4 0 3 
5 2 6 3 0 7 1 4 
5 3 0 4 7 1 6 2 
5 3 1 7 4 6 0 2 
5 3 6 0 2 4 1 7 
5 3 6 0 7 1 4 2 
5 7 1 3 0 6 4 2 
6 0 2 7 5 3 1 4 
6 1 3 0 7 4 2 5 
6 1 5 2 0 3 7 4 
6 2 0 5 7 4 1 3 
6 2 7 1 4 0 5 3 
6 3 1 4 7 0 2 5 
6 3 1 7 5 0 2 4 
6 4 2 0 5 7 1 3 
7 1 3 0 6 4 2 5 
7 1 4 2 0 6 3 5 
7 2 0 5 1 4 6 3 
7 3 0 2 5 1 6 4 

共有92个结果。


http://www.niftyadmin.cn/n/1441039.html

相关文章

一位后端开发者推荐的书籍

我推荐的如下书籍&#xff0c;都是我看过的&#xff0c;觉得还不错&#xff0c;很有启发意义&#xff0c;不管是本专业出身还是其他转行过来的&#xff0c;我认为都有必要看看。 推荐书一: 推荐理由: 可以让你系统了解什么是软件工程&#xff0c;采用什么方式让开发具有高效率&…

FileConnection的API简介(转)

FileSystemRegistry提供注册FileSystemListener监听器的方法&#xff0c;在修改设备中的根目录时&#xff0c;将调用该方法。建议每个应用软件都注册一个FileSystemListener监听器&#xff0c;在发生变化时&#xff0c;监听器将被告之发生了变化并做出适当响应。 由于FileConne…

myisamchk命令修复表操作

myisamchk命令使用总结 myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查、修复、优化他们 1.常用于myisamchk的检查选项--information, -i打印所检查表的统计信息。 --fast&#xff0c;-F只检查没有正确关闭的表。 --force, -f如果myisamchk发现表内有任何错误…

。oO排序

冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a; 重复地走访过要排序的元素列&#xff0c;依次比较两个相邻的元素&#xff0c;如果顺序&#xff08;如从大到小、首字母从Z到A&#xff09;错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换…

ES2018 学习笔记(3)标识符

以下内容来至 es2017 语言规范和 javascript 高级程序设计&#xff08;第三版&#xff09; 标识符 红宝书 3.1.2 中&#xff0c;对标识符如是定义&#xff1a; An identifier is the name of a variable, function, property, or function argument.我对此存有疑问——属性名是…

C++ is-a关系

首先举一个例子&#xff1a; 在日常生活中&#xff0c;我们所说的眼镜大都是带框的眼镜&#xff0c;但是当提起隐形眼镜时&#xff0c;我们想一下它属不属于眼镜呢&#xff1f;答案肯定是属于的。这里的隐形眼镜和眼镜就是属于 is-a 的关系。 在面向对象编程过程中&#xff0c;…

内联函数介绍-1(转)

介绍内联函数之前&#xff0c;有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏&#xff0c;我们会经常定义一些宏&#xff0c;如 #define TABLE_COMP(x) ((x)>0?(x):0) 就定义了一个宏。为什么要使用宏呢&#xff1f;因为函数的调用必…

项目0到1的一些感想

近期上线了一个新的项目&#xff0c;从前期的需求评审到项目整体设计&#xff0c;最后上线&#xff0c;历时了快一个月的时间。虽然是个小项目&#xff0c;但是由自己从头开始跟的项目。 这个项目让自己学到了很多&#xff0c;同时也发现了自己很多的不足&#xff0c;写篇文章总…