八皇后

推荐博客 :http://blog.163.com/yichangjun1989@126/blog/static/13197202820145226051666/

问题描述 :

  在一个 8 * 8 的棋盘上 , 可以放置8个皇后 , 皇后们如果在相同的一行或一列就会相互攻击,或者是在斜的对角线上也会相互攻击 ,问最多有多少种放置方法?

 

思路 :

  若要确保不再同一行,第一次可以在第一行放一个,第二次就直接放在第二行的位置,建一个数组 c[ i ] = j ,有什么作用呢 ? 第 i 个位置所在的列是 j  列。每次寻找的一个新位置如果符合与前面所有的已放置的位置都符合情况的话则递归进入下一层 。

 

代码示例 :

int ans = 0;
int c[10];

void dfs(int r){
    if (r > 8) {
        ans++;
        return;
    } 
    
    for(int i = 1; i <= 8; i++){
        c[r] = i;
        int sign = 1;
        for(int j = 1; j < r; j++){
            if (c[r] == c[j] || r - j == c[r] - c[j] || j - r == c[r] - c[j]){ // 判断不在同一列,也不在斜着的对角线上
                sign = 0;
                break;
            }
        }
        if (sign) dfs(r+1);
    }
}

int main() {
    
    dfs(1);
    printf("%d\n", ans);
    return 0;
}

 

posted @ 2017-10-24 14:42  楼主好菜啊  阅读(190)  评论(0编辑  收藏  举报