使用递归实现八皇后问题

1.问题描述

	在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

2.思路分析

  - 先将第一个皇后放在第一行第一列
  - 将第二个皇后放在第二行第一列,判断是否冲突,如果冲突,则放在第三、四......行,直到找到一个不冲突的位置
  - 第三个皇后重复上述步骤
  - 找到第一个皇后放在第一列的全部解
  - 然后再将第一个皇后放在第二、三..... 列

3.代码实现

1.皇后类
package Modules;

/**
 * @program: 6.递归的应用
 * @description: 皇后类
 * @author: Zhou Jian
 * @create: 2020-07-15 19:06
 */
public class Queue {
    // 统计一共有多少种摆法
    public int count = 0;
    // 判断冲突的次数
    public int WarCount = 0;
    // 定义皇后的数量
    private int max = 8;
    // 定义一个一维数组,用于存放皇后摆放的位置
    private int[] Array = new int[max];

    // 放入第n个皇后
    public void check(int n) {
        // 这里的max是8,说明已经摆放好了前8个皇后
        if (n == max) {
            Show();
            return;
        }
        // 放入第n个皇后,判断是否冲突
        for (int i = 0; i < max; i++) {
            Array[n] = i; // 将第n个皇后放在i这一列
            // 判断放入之后,是否冲突
            if(Judge(n)){
                check(n+1); // 不冲突则继续放
            }
        }
    }

    /**
     * 放入第n个皇后,判断是否和前n-1个皇后有冲突
     *
     * @param n 将要放入的第n个皇后
     * @return
     */
    public boolean Judge(int n) {
        WarCount++;
        for (int i = 0; i < n; i++) {
            /* 1.将要放入放入的第n个皇后和前面放入的皇后在同一列
               2.将要放入放入的第n个皇后和前面放入的皇后在同一斜线
             */
            if (Array[i] == Array[n] || Math.abs(n - i) == Math.abs(Array[n] - Array[i]){
                return false;
            }
        }
        return true;
    }

    // 显示矩阵
    public void Show() {
        count ++;
        System.out.println("第" + count + "种摆法是:");
        for (int i = 0; i < Array.length; i++) {
            System.out.print(Array[i] + "\t");
        }
        System.out.println();
    }
}
2.入口
package Modules;

import java.lang.reflect.Array;

/**
 * 做如下规定:
 * 这里使用一维数组存储,例如
 * int[] Array = {1,2,3,4,5,6,7,8};
 * 1 -----> 第1个皇后放在第1行第1列
 * 2 -----> 第2个皇后放在第2行第2列
 * .................................
 * ...............................
 * ..............................
 * ..........................
 */
public class Main {
    // 主方法
    public static void main(String[] args) {
        Queue q = new Queue();
        q.check(0);
        System.out.println("一共有:" + q.count + "种结果");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值