zoukankan      html  css  js  c++  java
  • N皇后问题


    Problem Description
    在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
    你的任务是,对于给定的N,求出有多少种合法的放置方法。


    Input
    共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

    Output
    共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

    Sample Input
    1
    8
    5
    0

    Sample Output
    1
    92
    10
    题意:都是汉语就不用解释了;
    解题思路:深搜,每找到一个出口就有一种摆法,这里判断条件唯一一个难点就是判断是不是斜线有皇后;
    斜线上是不是有皇后判断条件就是是不是到对角线的距离相等;
    感悟:两天一道题。。。。。慢死了啊
    图(原创):
    N皇后问题
       代码:
    #include
    #include
    #include
    #include
    #define maxn 15
    using namespace std;
    int n,visit[maxn],mapn[maxn],ans;
    int lis[maxn];
    void dfs(int t)
    {
        //cout<<"n="<<n<<endl;
        int flag;
        if(t==n+1)
        {
            ans++;
            //cout<<"到尽头了"<<endl;
            return;//结束的条件,每找到一个尽头,计时器就加1;
        }
        for(int i=1;i<=n;i++)
        if(visit[i]==0)//记录行数
        {
            mapn[t]=i;//记录满足条件的列数
            flag=1;//标志
            for(int j=1;j<=t-1;j++)
            if(mapn[j]==i||i-t==mapn[j]-j||i+t==mapn[j]+j)//判断是不是在一条斜线上
            //也就是到对角线的距离不一样
            {
                flag=0;
                break;
            }
            if(flag)
            {
                visit[i]=1;
                dfs(t+1);
                visit[i]=0;//将标记释放,用于下次搜索;
            }
        }
    }
    int main()
    {
        //freopen("in.txt", "r", stdin);
        for(int i=1;i<=10;i++)
        {
            ans=0;
            n=i;
            memset(visit,0,sizeof(visit));
            memset(mapn,0,sizeof(mapn));
            dfs(1);
            lis[i]=ans;
        }
        while(~scanf("%d",&n)&&n)
        printf("%d ",lis[n]);
    }


  • 相关阅读:
    借助GitStats进行项目统计
    sql查重复数据
    git增删远程分支
    iOS类继承及重用
    键盘消息多次被触发
    salt未持久化保存导致应用启动时候的网络请求失败(没有权限)
    resize view from nib引起的子控制器视图(childviewcontroller)部分区域无响应
    python脚本实现自动为png类型图片添加@2x后缀
    企业级后台列表常用操作
    java集合总结
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5781607.html
Copyright © 2011-2022 走看看