• 八皇后问题


    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);
        }
    
    }
  • 相关阅读:
    2022年9月3日
    2022年8月28日
    2022年9月8日
    2022年9月6日
    2022年8月30日
    2022年9月5日
    2022年9月感悟
    《伯恩斯焦虑自助疗法》读书笔记3
    神经网络与深度学习(邱锡鹏)编程练习 2 线性回归 参数优化 不同基函数实现
    神经网络与深度学习(邱锡鹏)编程练习 1 实验
  • 原文地址:https://www.cnblogs.com/pythonbigdata/p/12825687.html
Copyright © 2020-2023  润新知