HDU - 2553-N皇后问题

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

Input共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。Output共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。Sample Input

1
8
5
0

Sample Output

1
92
10
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>

using namespace std;

#define ll long long

int n, position[18], line[18], sum, r;

bool compare(int miao)
{
    for(int i = 1; i<miao; i++)//一行一行来判断,如果写线上有相同的或者同一列上有相同的,那就是错的
        if((abs(miao - i) == abs(line[miao]-line[i])) || line[miao] == line[i])
            return 0;
    return 1;
}

int queen(int t)
{
    if(t>r) sum++;
    else
        for(int i = 1; i <= r; i++)//一列一列的查找
        {
            line[t] = i;//第t行的第i列
            if(compare(t))queen(t+1);//如果在t阶矩阵下能进行排列,那就开始尝试t+1阶矩阵
        }
    return sum;
}

int main()
{
    memset(line, 0, sizeof(line));
    for(r= 1; r<11; r++)//在输入之前,先把所有的数存起来,解决时间。r为r阶矩阵下的n皇后
    {
        sum = 0;//每次都使sum = 0是为了在每次查r阶矩阵的时候,结果不会重复
        position[r] = queen(1);//一行一行的查找,先从第一行开始查找
    }
    while(~scanf("%d", &n) && n)
    {
        printf("%d\n", position[n]);
    }
    return 0;
}

 

posted @ 2019-03-05 21:24  明霞  阅读(268)  评论(0编辑  收藏  举报