八皇后(递归+深度优先搜索)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

package Demo;

public class 八皇后问题 {

    /**
     * @param args
     */
    static int count=0;//记录放八皇后的方案
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr=new int[8];
        dfs(arr,0);
        System.out.println(count);
    }
    public static void dfs(int[] arr,int row){
        //如果到了第九行,就跳出
        if(row==8){
            count++;
            for(int j=0;j<8;j++){
                System.out.print(arr[j]+" ");
            }
            System.out.println();
            return;
        }
        //row行从0列开始放置
        outer:for(arr[row]=0;arr[row]<8;arr[row]++){
            for(int j=0;j<row;j++){
                //如果同一列、同一对角线跳出该次循环
                if(arr[j]==arr[row]||arr[j]-arr[row]==j-row||arr[j]-arr[row]==row-j){
                    continue outer;
                }
            }
            dfs(arr,row+1);//放下一行
        }
        
    }
}

 

posted @ 2018-03-15 21:40  henu小白  阅读(1569)  评论(0编辑  收藏  举报