八皇后问题

主要是好久没有刷这种算法的题了,有点生疏,现在先把代码贴上吧,主要是一个深搜的使用,这里0,1,2应该是记录行列还有对角线的 具体以后再解释 先贴上代码

#include<iostream>
#include<cstring>
using namespace std;
//用于计数的值 和记录有没有被访问过
int cnt = 0,n,vis[3][10000];
void dfs(int cur){
    if(cur == n){
        cnt++;
        return;
    }
    for(int i = 1; i <= n; i++) {
        //在对角线还有行列上都没有被访问过
        if(!vis[0][i] && !vis[1][cur + i] &&!vis[2][cur - i + n]) {
            vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
            dfs(cur + 1);
        //取消值
        vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
    }
    }
}
int main() {
    while (cin>>n) {
        memset(vis, 0, sizeof(vis));
        //从第0行开始
        cnt = 0;
        dfs(0);
        cout<<cnt<<endl;
    }
    return 0;
}


你可能感兴趣的:(八皇后问题)