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

非常经典的N皇后问题,用回溯法搜索。注意记忆化,否则会超时。
#include<iostream>
#include<string.h>
#include<math.h>

using namespace std;

int a[15],b[15];

int s,n;

bool ok(int x,int y)
{
    for(int j=0;j<x;j++)
    {
        if(a[j]==y||abs(a[j]-y)==abs(x-j))
        {
                return false;
        }
    }
    return true;
}

void search(int x)
{
    if(x>=n)
        s++;
        else
        {
            for(int i=0;i<n;i++)
            {
                if(ok(x,i))
                {
                    a[x]=i;
                    search(x+1);
                }
            }
        }
}

int main()
{
    for(int i=1;i<=10;i++)
    {
        memset(a,0,sizeof(0));
        n=i;
        s=0;
        search(0);
        b[i]=s;
    }
    while(cin>>n)
    {
        if(!n)
            break;
        cout<<b[n]<<endl;
    }    
    
    return 0;
} 

 

posted @ 2017-07-28 20:06  西北会法语  阅读(185)  评论(0编辑  收藏  举报