dfs——n皇后问题

Posted kitalekita

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dfs——n皇后问题相关的知识,希望对你有一定的参考价值。

C - N皇后问题

 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=15;
int ans[maxn]; //用ans数组来记录n*n阶乘两个皇后的摆放数
int n;//表示棋盘的大小
int ans1;//ans1为摆放数
int ye[maxn]={0};
bool ok(int x,int y){//用于判断所放位置的皇后是否符合要求。
//若ok输出true,否则就false
    for(int i=0;i<x;i++)
        if(ye[i]==y||(x+y==i+ye[i])||(x-y==i-ye[i]))
            return false; 
    return true;
}
void dfs(int x1){//深度优先搜索//x1表示为行数
    if(x1==n){
        ans1++;
        return ;
    }
    for(int y1=0;y1<n;y1++){//在每一列放皇后;y1表示为列数
        if(ok(x1,y1)){//检查是否合法
            ye[x1]=y1;//在第x1 行的 y1 列放皇后
            bfs(x1+1);//回溯//继续放下一行皇后
        }
    }
} 
int main(){
    int i;int j;
    memset(ans,-1,sizeof(ans));//将ans数组赋为-1,用于打表,减少时间复杂度
    while(scanf("%d",&n)!=EOF){
        if(n==0)break;
        if(ans[n]<0){//当ans【n】<0,即该情况下未被计算,进行计算
//若不<0,则直接输出ans【n】中的值
//算出所有 n 皇后的答案。先打表不然会超时
        memset(ye,0,sizeof(ye)); //清空,准备计算下一个 N 皇后问题
        ans1=0;
        dfs(0);//开始搜索
        ans[n]=ans1;
        printf("%d
",ans[n]);
        }
        else printf("%d
",ans[n]);
    }
    return 0; 
}

这道题用dfs(深度优先搜索)来做的,

这道要注意的是要打表,否则就会超时。打表能节约计算,节约时间。

该题可作为做dfs题的模板。

以上是关于dfs——n皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

DFS+剪枝Aw842.排列数 & Aw843.N-皇后问题

图-搜索-DFS-51. N皇后

N皇后问题(暴力dfs)

DFS-C - N皇后问题

皇后问题(DFS)(位运算)

dfs——n皇后问题