zoukankan      html  css  js  c++  java
  • 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题的模板。

  • 相关阅读:
    Android网络通信的六种方式
    launcher4.0加载
    MessageDigest使用 完成MD5加密
    java集合
    Context
    android字库使用
    Java动态代理
    积累
    sql游标
    无限级CSS树形菜单
  • 原文地址:https://www.cnblogs.com/kitalekita/p/12210128.html
Copyright © 2011-2022 走看看