8皇后问题

发布于 2024-10-15 07:42:30 字数 63 浏览 6 评论 0原文

我怎样才能实现8/4皇后问题?我应该使用DFS/BFS,我认为DF会更好。 任何人都可以给出一些伪代码/指南吗?

How can i go about implemting 8/4 queens problem?Should i use DFS/BFS,I think DFs will be better.
Can any one give some pseudocode/guidlines?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

人事已非 2024-10-22 07:42:30

使用堆栈和回溯,最简单的方法是通过递归。

请参阅其他 SO 帖子:

C++ 中的 Dumb 8 Queens 问题

Use a stack and backtracking, easiest way is via recursion.

See these other SO posts:

Dumb 8 Queens problem in C++

°如果伤别离去 2024-10-22 07:42:30

我的解决方案有2个预定义的逻辑,行上只有一个皇后,列上只有一个皇后。
有一个长度为8的一维数组。所有数组值都设置0-7之一,但所有值都只使用一次(0-7值的排列)
arr[0]=5 值表示皇后位于第一行第 6 列
arr[1]=3 值表示皇后位于第二行第 4 列,
只需控制数组检查时的交叉违规值,无需检查行或行违规。排列和交叉违规函数满足您的所有需求(C++ STL 有排列函数,只需要交叉违规函数)

My solution have 2 pre-defined logics, there is only one queen at row, and there is only one queen at column.
There is an one-dimensional array that length is 8. All array value set one of the 0-7, but all values used exactly one time (permutation of values that 0-7)
arr[0]=5 value means queen at column 6 at first row
arr[1]=3 value means queen at column 4 at second row,
just control cross violation values on array check for, there is no need for check line or row violation. Permutation and cross violation functions all you need, (C++ STL has permutation functions, that just need to cross violation functions)

跨年 2024-10-22 07:42:30

则它们可以互相攻击

  1. 如果皇后位于 (i,j) 和 (k,l) 坐标,则如果i=k(同一行)
  2. j=l(同一列),
  3. |ik|=|jl| (对角线),| |表示绝对值

    布尔位置(k,i)
    {
    //如果皇后可以放置在第k行第i列,则返回true
    //x[] 是一个全局数组,已设置前 (k-1) 个值。
    //x[p]=q 表示皇后在位置 (p,q)
    
    对于(j=1 到 k-1)
    {
    if(x[j]==i)||(ABS(x[j]-i)==ABS(jk)) //检查是否有另一个皇后在同一列或对角线上
    返回假;
    }
    返回真;
    }
    

    要使用回溯打印所有可能的展示位置:

    void NQueens(k,n)
    {

    for(i=1 到 n)
    {
    if(place(k,i)) //检查皇后是否可以放置在(k,i)
    {
    x[k]=i;
    if(k==n) 然后写 (x[1:n]);  
    否则 Nqueens(k+1,n);
     }
     }
    }
    

*参考 saurabh 学校

If queens are at (i,j) and (k,l) coordinates,then they can attack each other if

  1. i=k (same row)
  2. j=l (same column)
  3. |i-k|=|j-l| (diagonally),| | denotes the absolute value

    bool place(k,i)
    {
    //returns true if the queen can be placed at k-th row and i-th column
    //x[] is a global array with first (k-1) values set already.
    //x[p]=q means a queen is at location (p,q)
    
    for(j=1 to k-1)
    {
    if(x[j]==i)||(ABS(x[j]-i)==ABS(j-k))  //checking if another queen in same column or     diagonally
    return false;
    }
    return true;
    }
    

    To print all possible placements using backtracking:

    void NQueens(k,n)
    {

    for(i=1 to n)
    {
    if(place(k,i)) //checking if queen can be placed at (k,i)
    {
    x[k]=i;
    if(k==n) then write (x[1:n]);  
    else Nqueens(k+1,n);
     }
     }
    }
    

*With reference from saurabh school

停顿的约定 2024-10-22 07:42:30

这是我使用回溯的实现。
改变N的值来得到不同的解。

它将打印给定数量的皇后的所有可用解决方案。

package com.org.ds.problems;

public class NQueueProblem {
private static int totalSolution = 0;
    public static void main(String[] args) {
        int n = 5;
        int arr[][] = new int[n][n];
        backTrack(arr, 0);
        System.out.println("\nTotal Number of Solutions are:- " + totalSolution);
    }

    private static void printQueuens(int[][] arr) {
        totalSolution++;
        System.out.println("\n========Start Printing Solution "+totalSolution+"=========");
        for(int i=0; i<arr.length;i++) {
            for(int j=0; j<arr.length;j++) {
                if(arr[i][j] == 1)
                    System.out.print(" Q"+(i+1) + " |");
                else
                    System.out.print("    |");
            }
            System.out.println();
        }
    }

    private static boolean backTrack(int[][] arr, int row) {
        if (row < 0 || row >= arr.length)
            return true;

        for (int col = 0; col < arr.length; col++) {
            if (isAttacked(arr, row, col)) {
                arr[row][col] = 1;
                if (backTrack(arr, row + 1)) {
                    if(row == (arr.length-1)) {
                        printQueuens(arr);
                        arr[row][col] = 0;
                    }
                    else {
                        return true;    
                    }
                } else {
                    arr[row][col] = 0;
                }
            }
        }
        return false;
    }

    private static boolean isAttacked(int[][] arr, int row, int col) {
        if (row == 0)
            return true;
        // check for same row
        for (int i = 0; i < arr.length; i++) {
            if (arr[row][i] == 1)
                return false;
        }
        // check for same col
        for (int i = 0; i <= row; i++) {
            if (arr[i][col] == 1)
                return false;
        }
        // check for diagonal
        // a.) Left dia
        int i = row - 1;
        int j = col - 1;
        while (i >= 0 && j >= 0) {
            if (arr[i][j] == 1)
                return false;
            i--;
            j--;
        }
        // b.) right dia
        i = row - 1;
        j = col + 1;
        while (i >= 0 && j < arr.length) {
            if (arr[i][j] == 1)
                return false;
            i--;
            j++;
        }
        return true;
    }
}

Here is my implementation using backtracking.
Change the value of N to get the different solutions.

It will print all the solutions available for given number of queens.

package com.org.ds.problems;

public class NQueueProblem {
private static int totalSolution = 0;
    public static void main(String[] args) {
        int n = 5;
        int arr[][] = new int[n][n];
        backTrack(arr, 0);
        System.out.println("\nTotal Number of Solutions are:- " + totalSolution);
    }

    private static void printQueuens(int[][] arr) {
        totalSolution++;
        System.out.println("\n========Start Printing Solution "+totalSolution+"=========");
        for(int i=0; i<arr.length;i++) {
            for(int j=0; j<arr.length;j++) {
                if(arr[i][j] == 1)
                    System.out.print(" Q"+(i+1) + " |");
                else
                    System.out.print("    |");
            }
            System.out.println();
        }
    }

    private static boolean backTrack(int[][] arr, int row) {
        if (row < 0 || row >= arr.length)
            return true;

        for (int col = 0; col < arr.length; col++) {
            if (isAttacked(arr, row, col)) {
                arr[row][col] = 1;
                if (backTrack(arr, row + 1)) {
                    if(row == (arr.length-1)) {
                        printQueuens(arr);
                        arr[row][col] = 0;
                    }
                    else {
                        return true;    
                    }
                } else {
                    arr[row][col] = 0;
                }
            }
        }
        return false;
    }

    private static boolean isAttacked(int[][] arr, int row, int col) {
        if (row == 0)
            return true;
        // check for same row
        for (int i = 0; i < arr.length; i++) {
            if (arr[row][i] == 1)
                return false;
        }
        // check for same col
        for (int i = 0; i <= row; i++) {
            if (arr[i][col] == 1)
                return false;
        }
        // check for diagonal
        // a.) Left dia
        int i = row - 1;
        int j = col - 1;
        while (i >= 0 && j >= 0) {
            if (arr[i][j] == 1)
                return false;
            i--;
            j--;
        }
        // b.) right dia
        i = row - 1;
        j = col + 1;
        while (i >= 0 && j < arr.length) {
            if (arr[i][j] == 1)
                return false;
            i--;
            j++;
        }
        return true;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文