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\n",ans[n]);
        }
        else printf("%d\n",ans[n]);
    }
    return 0; 
}

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

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

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

posted @ 2020-01-18 20:39  kitalekita  阅读(104)  评论(0编辑  收藏  举报