Java实现八皇后问题,用数组递归算法,简单易懂

八皇后问题

要将八个皇后放在棋盘上,任何两个皇后都不能互相攻击。即没有两个皇后是在同一行、同一列或者同一对角上。

典型的八皇后问题,使用Java写的算法,算法虽比较简单,但难免会有新手会犯疏漏和错误,希望大家可以批评指正,共同交流进步!

代码

@requires_authorization

public class Test {

    public static void main(String[] args) {
        Empress a=new Empress();
        a.find(0);
        System.out.println("八皇后问题共有:"+a.map+"种可能");
    }
}

class Empress{
    public int[][] arry=new int[8][8];    //棋盘,放皇后
    public  int map=0;     //存储方案结果

    public   boolean rule(int arry[][],int k,int j){    //判断节点是否合适
        for(int i=0;i<8;i++){       //行列冲突
             if(arry[i][j]==1)
                return false;
        }
        for(int i=k-1,m=j-1;i>=0&&m>=0;i--,m--){    //左对角线
            if(arry[i][m]==1)
                return false;
        }
        for(int i=k-1,m=j+1;i>=0&&m<=7;i--,m++){    //右对角线
            if(arry[i][m]==1)
                return false;
        }
        return true;
    }


    public void find(int i){    //寻找皇后节点
        if(i>7){    //八皇后解  
            map++;
            print();
            return;
        }
        for(int m=0;m<8;m++){       //深度优先,递归算法
            if(rule(arry,i,m)){
                arry[i][m]=1;
                find(i+1);
                arry[i][m]=0;
                }
        }   
    }

    public void print(){      //打印方法结果
        System.out.print("方案"+map+":");
        for(int i=0;i<8;i++){
            for(int m=0;m<8;m++){
                if(arry[i][m]==1){  
                    System.out.print("皇后"+(i+1)+"在第"+i+"行,第"+m+"列\t");

                }
            }
        }
        System.out.println();
    }
}

注意

在这个算法中,使用8X8数组来表示棋盘,元素赋值1代表存在一个皇后,0表示无。主要是要注意回溯过程中已舍弃的皇后代表的数组元素要置0,以免接下来继续使用深度优先搜索时,使用判断规则public boolean rule(int arry[][],int k,int j){}出现判断错误。

你可能感兴趣的:(Java)