N皇后的递归解法

解题思路: n皇后问题,就是考虑皇后放置的位置,对于每一行,需要枚举每个可以放置皇后的位置,我们需要判断当前位置(第i行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,如果冲突,说明这个位置不合适;则跳到下一列(注意是列),若还是冲突,继续跳到下一列,直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置。 否则的话,就可以枚举下一行皇后的位置,直至第n行。

判断满足条件方法:预设即是行间不冲突,一维数组存棋盘,遍历当前列之前的列,若与该数相同,则列重复;若行数差绝对值=列数差绝对值,对角线重复。

具体代码如下:(hdu2553会超时,可能只能打表。。)

//N queens problem//TLE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int plain[12];

bool ifset(int i, int j)
{

    for(int e = 1; e < i; e++)
    {
        if(plain[e]==j)
        {
            return false;
        }
        else if(abs(e-i)==abs(plain[e]-j))
        {
            return false;
        }
    }
    return true;

}

int ans;
int s_ize;
void Nqueens(int h) //DFS
{
    if(h==s_ize+1)
    {
        ans++;
        return;
    }
    int flag = 0;
    int l;
    for(l = 1; l <= s_ize; l++)
    {
        if(ifset(h, l))
        {
            plain[h] = l;
            flag = 1;
            Nqueens(h+1);
        }
    }
    if(l==s_ize+1 && !flag)
    {
        return;
    }
}

void init(int n)
{
    memset(plain, 0, sizeof(plain));
    ans = 0;
    s_ize = n;
}

int main()
{
    int n;
    while(scanf("%d", &n) && n)
    {
        init(n);
        Nqueens(1);
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/izayoi_w/article/details/79585654