首页 > 编程语言 >八皇后问题算法

八皇后问题算法

时间:2022-11-20 23:12:43浏览次数:39  
标签:int 问题 ++ 算法 冲突 皇后 array select

八皇后问题算法

  • 问题引入:在八行八列的格子上放8个皇后(棋子),使得任意两个皇后都攻击不到对方,即使得他们都不在同一行同一列和同一斜线上

  • 思路分析:

    1. 第一个皇后放在第一行第一列;
    2. 第二个皇后放在第二行第一列,判断是否满足,如果不满足,则继续放在第二列、第三列,依次放完所有列,找到合适的位置;
    3. 继续把第三个皇后放在第三行第一列、第二列....直到第8个皇后也能放在一个不冲突的位置,说明找到一个8皇后解了;
    4. 当找到正确解后,在栈回退到上一个栈时,就会开始回溯,即把第一个皇后放在第一列的所有正解都得到;
    5. 然后回头继续第一个皇后放在第二列,继续执行前面的所有步骤。
  • 说明:

    理论上应该创建一个二维数组表示棋盘,但是实际上可以通过算法,用一个一维数组就可以解决,如:

    Array[8]={0,4,7,5,2,6,1,3};

    数组的下标表示第几行,即第几个皇后,下标0表示第1一个皇后;数组的每一个值表示第i+1个皇后放在第i+1列。

  • 核心方法:

    • 方法1,将皇后的位置输出。
    • 方法2,检查放置当前皇后是否冲突。
    • 方法3,用于放置第n个皇后,使用了递归思想,select每一次递归时,进入到select中都由一个for循环,会由回溯。
  • 代码实现

package com.guodaxia.recursion;

/**
 * @ author Guo daXia
 * @ create 2022/11/20
 */
public class Queue8 {
    public static void main(String[] args) {
        //创建当前类对象
        Queue8 queue8= new Queue8();
        queue8.select(0);//从第一个皇后开始
        System.out.printf("一共有%d解法\n",count);
        System.out.printf("一共判断冲突的次数%d次\n",judgeCount);
    }
    static int count =0;
    static int judgeCount = 0;
    //8个皇后
    int max=8;
    //数组保存正解
    int[] array = new int[max];
    //方法3,用于放置第n个皇后,使用了递归思想,select每一次递归时,进入到select中都由一个for循环,会由回溯
    private void select(int n){
        if (n==max){
            //如果n=8,则8个皇后放好了
            print();//打印
            return;//结束
        }
        //依次放入皇后,需要判断是否冲突
        for (int i = 0; i < max; i++) {//i代表对某行  列扫描
            //第一个皇后固定在第一行第一列
            array[n]=i;
            //判断
            if (judge(n)){//judge方法true,表示不冲突
                //接下来放置n+1个皇后,递归
                select(n+1);
            }
            //接下来是冲突,继续执行array[n]=i;即将第n个皇后放在本行中的后移一个位置
        }
    }
    /**
     * 方法2,检查放置当前皇后是否冲突
     * @param n 表示第n个皇后
     * @return 返回false,则冲突;返回true,则不冲突
     */
    private boolean judge(int n){
        judgeCount++;
        for (int i = 0; i < n; i++) {
            //情况1,判断是否同一列,array[i]==array[n]
            //情况2,判断是否同一斜线上,行差==列差
            //情况3,是否同一行,因为n代表第n个皇后,所以不会同一行
            if (array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){
                return false;
            }
        }
        return true;
    }
    //方法1,将皇后的位置输出
    private void print(){
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.printf(array[i]+"");
        }
        System.out.println();
    }
}

标签:int,问题,++,算法,冲突,皇后,array,select
From: https://www.cnblogs.com/container-simple/p/16909994.html

相关文章

  • 跨域问题
      django解决跨域的问题使用django-cors-headers库MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middlew......
  • 凑面值问题
    //凑面值问题#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intn,res;inta[20];boolf[100000010];intgcd(inta,intb){ if(b==0)retu......
  • go模拟实现反向代理各种算法
    packageutiltypeHttpServerstruct{HoststringWeightint}typeLoadBalancestruct{Server[]*HttpServerCurrentIndexint}varMapWeight......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • 解决WPF中DataGrid移除选中项后报错的问题
    1、问题描述DataGrid列表中添加删除按钮,点击后执行下述操作:ModelList.Remove(item);这时候会有XAML绑定失败错误:严重性计数数据上下文绑定路径目标......
  • [排序算法] 快速排序 (C++) (含三种写法)
    快速排序解释快速排序QuickSort与归并排序一样,也是典型的分治法的应用。(如果有对归并排序还不了解的童鞋,可以看看这里哟~归并排序)❤❤❤快速排序的分治模式1、......
  • nps安装问题
    1、源码:​​https://github.com/ehang-io/nps​​2、参考文档:​​​​https://ehang-io.github.io/nps/#/?id=nps​​3、gobuildcmd/nps/nps.go后,第一次npsinstall。默......
  • DES和AES加密:指定键的大小对于此算法无效
    “System.ArgumentException”类型的未经处理的异常在mscorlib.dll中发生其他信息:指定键的大小对于此算法无效。在看DES和AES加密的时候,找了个加密的Demo,自己试验的时......
  • python算法题1:给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标
    题目:给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值index1和index2,其中index1必须小于index2。 说明: ......
  • 在新建FileInputStream时使用当前相对路径或者绝对路径作为参数的问题
    当new一个FileInputStream时,想使用相对路径这样无论我的服务端部署到哪里,都可以一直用一个文件夹而不必修改程序的路径代码,当然首先我用的绝对路径来做实验,......