HDU2553 N皇后问题

来源:互联网 发布:淘宝价格怎么设置打折 编辑:程序博客网 时间:2024/05/22 15:47

N皇后问题

Problem Description

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

Input

共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。

Output

共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。

Sample Input

1850

Sample Output

19210

————————————————————————————————————————————————————

求N皇后有多少种方法,只能试探性的在每个位置暴力搜,用一个一维数组map[i],表示i行皇后位置可减少判断。会超时,所以先打表

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<string>using namespace std;int map[12];int cnt;bool cheak(int x,int y){    for(int i=1;i<x;i++)    {        if(map[i]==y||abs(x-i)==abs(map[i]-y))             return 0;    }    return 1;}void dfs(int x,int m){    if(x>m)    {        cnt++;        return;    }    for(int i=1;i<=m;i++)    {        if(cheak(x,i))        {            map[x]=i;            dfs(x+1,m);        }    }}int main(){    int a[11],m;    a[0]=0;    for(int i=1;i<=10;i++)    {        cnt=0;        dfs(1,i);    a[i]=cnt;    }    while(~scanf("%d",&m)&&m)    {           printf("%d\n",a[m]);    }    return 0;}


0 0