zoukankan      html  css  js  c++  java
  • 八皇后问题

    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);
        }
    
    }
  • 相关阅读:
    三分
    知识点整合摘取
    Codeforces Round #533 C. Ayoub and Lost Array
    判断当前VC 是push还是present的
    自动布局
    获取当前的 viewController
    UIImageView 点击放大缩小
    UIButton 在UIScrollView里面 点击效果不明显的问题
    IOS AutoLayout 遍历修改约束
    GIT 命令 操作 记录
  • 原文地址:https://www.cnblogs.com/pythonbigdata/p/12825687.html
Copyright © 2011-2022 走看看