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

    N皇后问题

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 723 Accepted Submission(s): 419
     
    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
     
    Author
    cgf
     
    Source
    2008 HZNU Programming Contest
     
    Recommend
    lcy
     
    #include<bits/stdc++.h>
    #define maxn 15
    using namespace std;
    int low[15],res[15];
    int lmid[15],rmid[15];//左斜线和右斜线都是从上往下数的
    int n;
    int cur;
    void dfs(int x)
    {
        if(x==n)
        {
            cur++;
            return ;
        }
        for(int i=x;i<n;i++)
        {
            if(low[i])continue;
            for(int j=0;j<n;j++)
            {
                if(res[j]||lmid[i+n-1-j]||rmid[i+n-(n-j)]) continue;
                low[i]=1;
                res[j]=1;
                lmid[i+n-1-j]=1;
                rmid[i+n-(n-j)]=1;
                dfs(x+1);
                low[i]=0;
                res[j]=0;
                lmid[i+n-1-j]=0;
                rmid[i+n-(n-j)]=0;
            }
        }
    
    }
    int main()
    {
        for(n=1;n<=10;n++)
        {
            memset(low,0,sizeof low);
            memset(res,0,sizeof res);
            memset(lmid,0,sizeof lmid);
            memset(rmid,0,sizeof rmid);
            cur=0;
            dfs(0);
            cout<<"n="<<n<<" "<<cur<<endl;
        }
    }
    /* 附带打表大法,打表大法好啊!
    #include <iostream>
    #include<stdio.h>
    using namespace std;
    int n,x[11]={0,1,0,0,2,10,4,40,92,352,724};
    int main()
    {
        while(~scanf("%d",&n)&&n)
        printf("%d
    ",x[n]);
        return 0;
    }*/
  • 相关阅读:
    P1828 [USACO3.2]香甜的黄油 Sweet Butter 题解
    P2058 海港 题解
    浅谈三分算法
    海伦公式的证明
    一年一回首
    再谈单调队列优化 & 背包九讲
    浅谈单调队列
    P1440 求m区间内的最小值 题解
    CF1374B Multiply by 2, divide by 6 题解
    组合数、杨辉三角与递推算法
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/6075014.html
Copyright © 2011-2022 走看看