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);
        }
    
    }
  • 相关阅读:
    [LeetCode] 56. Merge Intervals 解题思路
    [LeetCode] 128. Longest Consecutive Sequence 解题思路
    [LeetCode] Subsets I (78) & II (90) 解题思路,即全组合算法
    linux安装PHP7以及扩展
    php安装composer
    细说PHP中strlen和mb_strlen的区别
    mysql一些简单操作
    mysql数据库使用Navicat时向Navicat导入sql文件时某字段过大时的处理
    JS中||的某些用法
    PHP验证身份信息
  • 原文地址:https://www.cnblogs.com/pythonbigdata/p/12825687.html
Copyright © 2011-2022 走看看