八皇后问题

Posted pythonbigdata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后问题相关的知识,希望对你有一定的参考价值。

1、经典八皇后问题

要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。问有多少种摆法。

package dfs;

public class EightQueen {

    /**
     * @param args
     */
    static int count=0;
    public static void Bhhs(int [][]a,int n,int x){
        if (n==0||x==a.length){
            count++;
            return;
        }
        for(int i=0;i<a.length;i++){
            if(check(a,x,i)){
                a[x][i]=1;
                Bhhs(a,n-1,x+1);
                a[x][i]=0;
            }
        }
        
    }
    public static boolean check(int[][]a,int x,int y){
        int sum1=0,sum2=0,sum3=0,sum4=0;
        for(int j=0;j<a.length;j++){
            sum1+=a[x][j];//行搜索
            if(sum1>0){
                return false;
            }
            sum2+=a[j][y];//列搜索
            if(sum2>0){
                return false;
            }
        }
        for (int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                if(y-x==j-i){//正对角线
                    sum3+=a[i][j];
                    if(sum3>0){
                        return false;
                    }
                }
            }
        }
        for(int i=0;i<x;i++){
            for(int j=0;j<a.length;j++){
                if(y+x==j+i){//负对角线
                    sum4+=a[i][j];
                    if(sum4>0){
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n=8;
        int [][]b=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                b[i][j]=0;
            }
        }
        Bhhs(b,n,0);
        System.out.println(count);
    }

}

扩展

n皇后:借鉴于:https://blog.csdn.net/lianggege88/article/details/105715931

技术图片

 

 

package dfs;
import java.util.Scanner;
public class EightQueen {

    /**
     * @param args
     */
    static int count=0;
    public static void Bhhs(int [][]a,int n,int x){
        if (n==0||x==a.length){
            count++;
            return;
        }
        for(int i=0;i<a.length;i++){
            if(check(a,x,i)){
                a[x][i]=1;
                Bhhs(a,n-1,x+1);
                a[x][i]=0;
            }
        }
        
    }
    public static boolean check(int[][]a,int x,int y){
        int sum1=0,sum2=0,sum3=0,sum4=0;
        for(int j=0;j<a.length;j++){
            sum1+=a[x][j];//行搜索
            if(sum1>0){
                return false;
            }
            sum2+=a[j][y];//列搜索
            if(sum2>0){
                return false;
            }
        }
        for (int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                if(y-x==j-i){//正对角线
                    sum3+=a[i][j];
                    if(sum3>0){
                        return false;
                    }
                }
            }
        }
        for(int i=0;i<x;i++){
            for(int j=0;j<a.length;j++){
                if(y+x==j+i){//负对角线
                    sum4+=a[i][j];
                    if(sum4>0){
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner (System.in);
        int n=sc.nextInt();
        int [][]b=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                b[i][j]=0;
            }
        }
        Bhhs(b,n,0);
        System.out.println(count);
    }

}

拓展:

八皇后问题

技术图片

 

 技术图片

 

 

package dfs;
import java.util.Scanner;
public class EightQueenQuestion {

    /**
     * @param args
     */
    static int max=0;
    static int [][]var=new int [8][8];
    static int [][]a=new int [8][8];
    public static void dfs(int n,int x,int sum){
        if(n==0||x==a.length){
            if(sum>max){
                max=sum;
            }
            return ;
        }
        for(int i=0;i<a.length;i++){
            if(check(x,i)){
                var[x][i]=1;
                dfs(n-1,x+1,sum+a[x][i]);
                var[x][i]=0;
            }
        }
        
    }
    public static boolean check(int x,int y){
        int sum1=0,sum2=0,sum3=0,sum4=0;
        for(int i=0;i<a.length;i++){
            sum1+=var[x][i];
            if(sum1>0){
                return false;
            }
            sum2+=var[i][y];
            if(sum2>0){
                return false;
            }
        }
        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                if(y-x==j-i){
                    sum3+=var[i][j];
                    if(sum3>0){
                        return false;
                    }
                }
                
            }
        }
        for(int i=0;i<x;i++){
            for(int j=0;j<a.length;j++){
                if(x+y==i+j){
                    sum4+=var[i][j];
                    if(sum4>0){
                        return false;
                    }
                }
                
            }
        }
        return true;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);    
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                a[i][j]=sc.nextInt();
            }
        }
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                var[i][j]=0;
            }
        }
        dfs(8,0,0);
        System.out.println(max);
    }

}

 

以上是关于八皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

八皇后,回溯与递归(Python实现)

基于WPF的八皇后简单应用程序

八皇后问题的遗传算法解法,c语言编写

八皇后问题

八皇后

八皇后问题