八皇后问题

这个还是有点意思的

代码分为check部分和递归部分

//程序运行后输出八皇后问题的解的数量
public class EightQueens {
    public int[] a = { -1, -1, -1, -1, -1, -1, -1, -1 }; // 元素默认值是-1
    public int ways = 0; // 解决方案计数器

    public boolean check(int row, int col) { // 在row行,col列可以放置皇后吗?
        // 初始行,第一行,无须判断,可以放皇后,下面的循环不执行
        for (int i = 0; i < row; i++) {
            if (a[i] == col) { // 判断同列是否有皇后冲突
                return false; // 返回0表示不能放,有冲突
            }
            if (row - i == Math.abs(col - a[i])) { // 判断对角线是否有皇后冲突,注意调用了绝对值函数
                return false;
            }
        }

        return true;
    }

    // 此函数实现在第n行放置皇后, 第n行的某一列如果放皇后,则a[n]的值由-1改为该列的列值
    public void place(int n) {
        if (n == 8) { // 递归函数的出口,从0到7行都已经放置完毕,并且都是正确的,所以当n=8的时候,
            // 方案数加1

            ways++;

            // 可以将a[n]的值输出,此处代码省略

        } else {//核心代码
                //i 表示 column 
                //这一部分实现了依次检索第n 行的第i列,判断是否可以放皇后,如果没有一个位置可以放,函数就
                //结束了说明之前的放置都是无效的...
                for(int i = 0; i < 8; i++){
                    a[n]=i;
                    if(check(n, i)){
                        place(n+1);
                    }
                }
        }
    }

    public static void main(String[] args) {
        EightQueens eq = new EightQueens();
        eq.place(0);
        System.out.println(eq.ways);
    }

}

 

posted @ 2018-07-07 11:50  zhangyue_lala  阅读(153)  评论(0编辑  收藏  举报