n皇后问题的解法

2022-03-15  本文已影响0人  xiaohei_e853

解法一

import java.util.Scanner;

public class Demo {
    static int[] q = new int[20];
    static int count = 0;

    public static void n_queens(int k, int n) {
        int j;
        if (k > n)
            print(n);
        else {
            for (j = 1; j <= n; j++) // 试探第k行的每一列,找到符合要求的列
            {
                if (isSafe(k, j)) {
                    q[k] = j;
                    n_queens(k + 1, n); // 在确认第 k 行皇后位置的前提下,继续测试下一行皇后的位置
                }
            }
        }
    }

    public static boolean isSafe(int k, int j) {
        int i;
        for (i = 1; i < k; i++) {
            // 如果有其它皇后位置同一列上,或者位于该位置的斜线位置上,则该位置无法使用
            if (q[i] == j || Math.abs(i - k) == Math.abs(q[i] - j))
                return false;
        }
        return true;
    }

    // 输出 N 皇后问题的解决方案
    public static void print(int n) {
        int i, j;
        count++;
        System.out.println("第 " + count + " 个解:");

        for (i = 1; i <= n; i++) // 行
        {
            for (j = 1; j <= n; j++) // 列
            {
                if (q[i] != j)
                    System.out.print("x");
                else
                    System.out.print("Q");
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) {
        System.out.println("请输入皇后个数:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        n_queens(1, n);
        System.out.println("共有 " + count + " 种摆放方式");
    }
}

解法二回溯算法

待续
package test;


import java.util.Arrays;

public class NhuanghouTest {

    static int n = 8;
    static int[] queque = new int[10];

    static int count=0;

    public static void main(String[] args) {


        trace(1);


    }

    public static void trace(int k){

        if(k>n){
            System.out.println(Arrays.toString(queque));
            count++;
            System.out.println(count);
        }else {

            for (int j = 0; j < n; j++) {
                if(isSafe(k,j)){
                    queque[k]=j;
                    trace(k+1);
                    queque[k]=0;
                }
            }

        }
    }

    private static  boolean isSafe(int row,int j) {


        for (int i = 1; i < row; i++) {
            if((queque[i]==j)||(Math.abs(row-i)==Math.abs(j-queque[i]))){
                return false;
            }

        }

        return true;

    }
}

上一篇下一篇

猜你喜欢

热点阅读