zoukankan      html  css  js  c++  java
  • HDU 2553 N皇后问题【棋盘型DFS】

    N皇后问题

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 12904    Accepted Submission(s): 5811


    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*n棋盘上下n个棋(棋无差别),使这些棋互不同行,互不同列,互相不在一条斜对角线上,给你一个n,问有几种棋的摆法。
    【分析】:

     n皇后问题,就是考虑皇后放置的位置,对于每一行,需要枚举每个可以放置皇后的位置,我们需要判断当前位置(第i

    行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,如果冲突,说明这个位置不合适;则跳到下一列

    (注意是列),若还是冲突,继续跳到下一列,直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇

    后向之前放置的下一列重新放置。  否则的话,就可以枚举下一行皇后的位置,直至第n行。(注意该题要提前将数据打好表来做,要不然会超时)

    【代码】:
    #include <cstdio>  
    #include <cmath>  
    int qizi[20];//qizi【i】=j表示 第i行第j列下有棋   
    int biao[11];//结果存到表中,不存会超时   
    int n;  
    int qingkuang;  
    bool judge(int hang)  
    {  
        for(int i=1;i<hang;i++)//扫之前下过棋每一行是否有与此次所下棋的位置同列的 或同对角线的   
        {  
            if(qizi[i]==qizi[hang]||abs(hang-i)==abs(qizi[hang]-qizi[i]))//对角线的话斜率的绝对值=1   
            return false;   
        }  
        return true;  
    }  
      
    void dfs(int hang)  
    {  
        if(hang==n+1)//比如n=2,然后该第二行下棋了,第二行如果能成功选择的话,那么那么新的行数3就等于n+1=3了 ,实在不懂举个例子看看   
        qingkuang++;  
        else  
        {  
            for(int j=1;j<=n;j++)//在该行选第几列   
            {  
                qizi[hang]=j;  
                if(judge(hang))  
                {  
                    dfs(hang+1);//在本行能下棋的话,就接着下下一行的棋   
                }  
            }   
        }  
    }  
    void cnt(int n)  
    {  
        dfs(1);//从第一行开始选地方下棋   
    }  
    int main()  
    {  
        for(n=1;n<=10;n++)  
        {  
            qingkuang=0;  
            cnt(n);  
            biao[n]=qingkuang;  
        }  
        int q;  
        while(scanf("%d",&q)!=EOF)  
        {  
            if(q==0)  
            break;  
            printf("%d
    ",biao[q]);  
        }  
        return 0;  
    }  
    DFS
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<stack>
    #include<bitset>
    #include<cstdlib>
    #include<cmath>
    #include<set>
    #include<list>
    #include<deque>
    #include<map>
    #include<queue>
    #define ll long long
    using namespace std;
    
    int a[15],n,sum,x;
    
    bool check(int x)
    {
        for(int i=1;i<x;i++)//注意取不到x
        {
            if(a[i]==a[x] || abs(x-i) == abs(a[x]-a[i]) )
                return false;
        }
        return true;
    }
    void dfs(int x)
    {
         if(x>n)
             sum++;
    
         else
         {
            for(int i=1;i<=n;i++)
            {
                 a[x]=i;
                if(check(x))
                {
                    dfs(x+1);
                }
            }
         }
    }
    
    int main()
    {
        int ans[11];
        for(n=1;n<=10;n++)
        {
            sum=0;
            dfs(1);
            ans[n]=sum;
        }
        while(~scanf("%d",&n),n)
        {
            printf("%d
    ",ans[n]);
        }
        return 0;
    }
    another DFS
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7435588.html
Copyright © 2011-2022 走看看