hdu 2553 经典n皇后问题

题意:

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

 

用一个一维数组来保存每行的皇后所在的列,降低空间复杂度。

这道题比较坑的是不打表容易tle。。。t了2次才不甘心的打表ac。

#include<iostream>
#include<math.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<string>
#define ll long long
#define MAX_N 105

using namespace std;

int n;
int num[15];
int ans[15],temp;
bool judge(int row,int col)
{
    for(int i = 1; i < row; i++)
    {
        if(abs(num[i]-col)==abs(i-row) || col==num[i])
            return false;
    }
    return true;
}
void solve(int row)
{
    if(row>n)
    {
        temp++;
        return ;
    }
    for(int i = 1; i <= n; i++)
    {
        if(judge(row,i))
        {
            num[row] = i;
            solve(row+1);
        }
    }
}
int main()
{
    cin.sync_with_stdio(false);
    for(int i = 1; i <= 10; i++)
    {
        n = i,temp = 0;
        solve(1);
        ans[i] = temp;
    }
    while(cin>>n,n)
    {
        cout<<ans[n]<<endl;
    }
    return 0;
}

 

posted @ 2017-12-08 15:11  Xycdada  阅读(148)  评论(0编辑  收藏  举报