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

    N皇后问题

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


    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
     
    这是一道学习回溯法的经典例题。
    直接用解答树进行DFS搜索。
    我们可以让vis[0][i]表示行, vis[1][cur+i]表示主对角线,   vis[2][cur-i+n]表示从对角线(由于cur-i可能为负值,所以都加上一个n)。
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    int C[50], vis[3][50], tot, n;
    
    void dfs(int cur)
    {
        if(cur==n) tot++;
        else for(int i=0; i<n; i++)
        {
            if(!vis[0][i]&& !vis[1][cur+i] && !vis[2][cur-i+n])
            {
                C[cur] = i;
                vis[0][i] = vis[1][i+cur]=vis[2][cur-i+n] = 1;
                dfs(cur+1);
                vis[0][i] = vis[1][i+cur]=vis[2][cur-i+n] = 0;
            }
        }
    }
    
    int main()
    {
        while(scanf("%d", &n)!=EOF&&n)
        {
            tot = 0;
            memset(vis, 0, sizeof(vis));
            dfs(0);
            printf("%d
    ", tot);
        }
        return 0;
    }

    无奈上面的代码依然超时。 然而小恪机智的发现,此题的数据是这么的亲民! 就10个数。 用上面的程序打表飘过。

    #include<cstdio>
    int C[11] = {0, 1, 0, 0 ,2 ,10 ,4 ,40 ,92 ,352, 724};
    
    int main()
    {
        int n;
        while(scanf("%d", &n)!=EOF&&n)
        {
            printf("%d
    ", C[n]);
        }
        return 0;
    }
     
  • 相关阅读:
    Python下载安装
    批量修改样式及全选反选
    小99
    练习题
    练习
    对象、函数
    操作document对象练习
    练习题
    0513-2
    0513-1
  • 原文地址:https://www.cnblogs.com/acm1314/p/4747357.html
Copyright © 2011-2022 走看看