N皇后问题

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

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

1
8
5
0

Sample Output

1
92
10

分析:搜索,每次检查一下该列是否已经放了皇后,同时检查主副对角线,主副对角线参考了别人数学的处理方法,即:在对角线上的两点坐标满足横纵坐标之差的绝对值相等!我刚开始是每一次输入一个查询的数据就搜索一次,然后交上去的代码超时了,后来用自己写的代码输出结果打了个表就AC了,参考了别人的博客,发现他们用的记忆化搜索的方式,就避免了重复搜索!我还是太菜啊!

AC代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#define N 15
using namespace std;
int ans;
int Queen[N];
int n;

void dfs(int k)
{
    if (k==n+1)
    {
        ans++;
        return ;
    }
    int i,j;
    for ( i=1;i<=n;i++)
    {
          for (j=1;j<k;j++)
         {
             if (Queen[j]==i||abs(Queen[j]-i)==abs(k-j))
                 break;
         }
         if (j>=k)
         {
             Queen[k]=i;
             dfs(k+1);
         }
    }


}
int sum[N];
int main()
{
    for (int i=1;i<=10;i++)
      {
          n=i;
          ans=0;
          dfs(1);
          sum[i]=ans;
      }
    while (cin>>n&&n!=0)
      {
         cout << sum[n] << endl;
      }
    return 0;
}

 

 
posted @ 2018-01-27 19:06  你的女孩居居  阅读(206)  评论(0编辑  收藏  举报