搜索 八皇后问题

 

八皇后问题:

问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

 

搜索经典题。

难的点在于想出对角线的标记。

首先在棋盘上建立坐标(i,j);

 

 

可以放斜率为正(从左下到右上的直线  /

发现从左上到右下斜线排列的顺序,可以用 i + j 进行标记

0,1,2,3,4,5,6,7,8,9...12,13

 

那么类似的,我们可以推出 i - j

 7.6,5,4,3,2,1,0,-1 .. -6,-7

 

#include <iostream>
using namespace std;

    int ans = 0;
    const int MAXN = 8;
    bool row[MAXN],x1[MAXN*2],x2[MAXN*2];
    
bool check(int c,int i){//检测是否在对角线以及这行有皇后 
    return !row[i] && !x1[c+i] && !x2[c-i+MAXN];
}

void dfs(int c){//在c行i列放皇后 
    if(c == 8){
        ans++;
        return;
    }
    for(int i=0;i<8;++i){
        if(check(c,i)){
            row[i] = x1[c+i] = x2[c-i+MAXN] = true;
            dfs(c+1);
            row[i] = x1[c+i] = x2[c-i+MAXN] = false;
        }
    }
}
int main() {
    dfs(0);
    cout << ans << endl;
    return 0;    
}

 

posted @ 2019-03-09 15:46  zz2108828  阅读(290)  评论(0编辑  收藏  举报